Const静态方法修改值

use*_*174 4 c++ 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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译和工作,输出是1.5,我期待编译器出错,因为我有一个const方法试图修改参数的值.

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

jog*_*pan 5

  1. 您声明的方法不是const.它返回一个const void(不管是什么),但它const本身不是一个方法.

  2. 如果它被宣布

    void modify(float& dummy) const
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 请注意,为了声明const方法,我不得不删除static规范.一个static方法永远不可能const的,因为静态方法不能修改任何成员反正.

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

    static void modify(const float& dummy)
    
    Run Code Online (Sandbox Code Playgroud)

为了说明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
  }  
};
Run Code Online (Sandbox Code Playgroud)

如您所见,它无法修改成员,但可以修改其参数的值.如果你想防止这种情况,你需要提出这个论点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
  }  
};
Run Code Online (Sandbox Code Playgroud)