Const静态方法修改值

时间:2012-11-09 06:00:31

标签: 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);
}

此代码编译并运行,输出为1.5,我期待编译器出错,因为我有一个const方法试图修改参数的值。

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

2 个答案:

答案 0 :(得分:5)

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

  2. 如果宣布

    void modify(float& dummy) const
    

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

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

  4. 如果你想阻止函数修改它的参数,你必须使参数为const:

    static void modify(const float& dummy)
    

  5. 为了说明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
      }  
    };
    

答案 1 :(得分:1)

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

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

您要更改的所有参数中的第二个不是const。如果'modify'不是静态函数并且函数上有'const'修饰符,则仍然可以修改dummy:

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.
}