如何使类的方法为const

how can I make a method of a class be const

本文关键字:const 方法 何使类      更新时间:2023-10-16

如何正确地写入:

bool const f(...);
or bool f(...) const ;
or const bool f(...)  ;

我的意思是,他们之间是否有区别?

  1. const bool f();表示它返回一个永远不会更改其值的常量布尔
  2. bool f() const;说f是一个常量函数,它不会修改类中的任何变量

const bool f();的情况1中,返回的bool必须声明为常量,并在声明或类的构造函数中初始化。

const bool f() { return m_bool; }

其中m_bool被声明为const bool m_bool = false;

在情况2 bool f() const;中,返回值并不保证它永远不会被更改,但函数本身保证它不会更改类内的任何数据成员,也不会调用任何未声明为const的成员函数。(部分例外情况适用)

bool f() const { return m_bool; } // valid
bool f() const { m_bool = false; return m_bool; } // invalid, m_bool cannot be changed from a const function.

其中m_bool可以声明为const bool m_bool = false;bool m_bool;


有关常量变量的更多信息可以在此处找到,有关常量函数的更多信息也可以在此处查找。

  1. 布尔常量f(…)
  2. 布尔f(…)常量
  3. const bool f(…)

1和3是相同的东西,只是constbool的顺序不同。这两个表示返回的bool是一个常量。但是,由于您的代码很可能正在执行类似bool b = myobject.f();的操作,因此变量b无论如何都是f()返回的值的副本,因此没有任何区别。

2使函数f()中的this指针成为const T *this(其中T是您的类),这意味着类中的任何内容都不允许修改。这可能是你最初想要的。

函数名称之前的是返回类型。类型中的const适用于它左边的任何内容,除非它左边什么都没有,在这种情况下,它适用于右边的任何内容。因此,第一个和第三个返回类型是constbools,第二个是非constbool。具有const返回类型意味着不能修改返回的值。

在函数自变量列表之后具有const使得函数成为const函数。这只适用于成员函数(即在类中声明的)。const成员函数只能在const对象上调用。因此,如果您有一个类foo和一个非const成员函数f,您将无法执行以下操作:

const foo a_foo;
a_foo.f(); // Error because a_foo is const but f is not a const member function

因此,选项1和3是相同的——它们是返回const bool的非const函数——而选项2是不同的——它是返回boolconst函数。