const静态方法修改值



我正在尝试const关键字并尝试从中获得有用的方法。

#include <iostream>
class A
{
  public:
  static const void modify(float& dummy)
  {
    dummy = 1.5f;
  }  
};
int main(int argc, char* argv[])
{
  auto a = 49.5f;
  A::modify(a);
  std::cout << a << std::endl; 
  return(0);
}

此代码编译和工作,输出为1.5,我期望编译器出现错误,因为我有一个试图修改参数值的const方法。

我在这里缺少什么?我如何设计不会修改参数值的方法?

  1. 您声明的方法不是const。它返回const void(无论是什么),但不是const -Method本身。

  2. 如果被声明为

    void modify(float& dummy) const
    

    它将是一个const方法,但随后仍然可以修改参数的值,因为允许const方法执行此操作。它唯一不允许做的就是修改其属于的类成员的值。

  3. 请注意,要声明const方法,我必须删除static规范。static方法永远不可能是const,因为静态方法无论如何都无法修改任何成员。

  4. 如果要防止函数修改其参数,则必须使参数const:

    static void modify(const float& dummy)
    

说明const方法可以做什么和不能做什么,这是一个具有成员和const功能的类:

class A
{
  float my_member;
public:
  void modify(float& dummy) const
  {
    my_member = dummy; // attempt to modify member -> illegal
    dummy = 1.5f;      // modifies a non-const argument -> ok
  }  
};

您可以看到,它无法修改成员,但可以修改其参数的值。如果要防止这种情况,则需要进行参数const

class A
{
  float my_member;
public:
  void modify(const float& dummy) const
  {
    my_member = dummy; // attempt to modify member -> illegal
    dummy = 1.5f;      // attempt to modify a const reference -> illegal
  }  
};

您在这种情况下误解了'const'的作用及其运作方式。

首先,在C 静态成员函数中不能为const。您显示的功能返回一种" const void"类型(这是否有意义以及编译器是否应该警告是另一个主题)。

第二个参数中的第二个不是const。如果"修改"不是静态函数,并且在该功能上具有" const"修饰符,则假人仍然可以修改:

void modify_nonstatic(float &dummy) const
{
    dummy = 1.5f; // perfectly fine - dummy isn't a member of
                  // the class and can be modified
}

如果您希望参数为const,请制作参数const:

static void modify(const float &dummy) 
{
    dummy = 1.5f; // fail! you can't modify a const.
}
void modify_nonstatic(const float &dummy)
{
    dummy = 1.5f; // fail! you can't modify a const.
}

最新更新