C++"const"关键字解释

Raj*_*ajX 34 c++ const constants

在阅读用C++编写的教程和代码时,我经常偶然发现const关键字.

我看到它使用如下:

const int x = 5;
Run Code Online (Sandbox Code Playgroud)

我知道这意味着它x是一个常量变量,可能存储在只读内存中.

但究竟是什么

void myfunc( const char x );
Run Code Online (Sandbox Code Playgroud)

int myfunc( ) const;
Run Code Online (Sandbox Code Playgroud)

Ste*_*end 55

void myfunc(const char x);
Run Code Online (Sandbox Code Playgroud)

这意味着该参数x是一个char,其值不能在函数内部更改.例如:

void myfunc(const char x)
{
  char y = x;  // OK
  x = y;       // failure - x is `const`
}
Run Code Online (Sandbox Code Playgroud)

对于最后一个:

int myfunc() const;
Run Code Online (Sandbox Code Playgroud)

这是非法的,除非它在类声明中 - const成员函数阻止修改任何类成员 - const不能使用非成员函数.在这种情况下,定义将是这样的:

int myclass::myfunc() const
{
  // do stuff that leaves members unchanged
}
Run Code Online (Sandbox Code Playgroud)

如果您具有需要在const成员函数中修改的特定类成员,则可以声明它们mutable.一个示例是lock_guard使类const和非const成员函数线程安全的成员,但必须在其自己的内部操作期间进行更改.


Pau*_*oub 10

第一个功能示例或多或少没有意义.更有趣的是:

void myfunc( const char *x );
Run Code Online (Sandbox Code Playgroud)

这告诉编译器内容*x将不会被修改.也就是说,在myfunc()你内部不能做到这样的事情:

strcpy(x, "foo");
Run Code Online (Sandbox Code Playgroud)

第二个示例,在C++成员函数上,意味着调用不会更改对象的内容.

所以给出:

class {
  int x;
  void myfunc() const;
}
Run Code Online (Sandbox Code Playgroud)

someobj.myfunc() 不允许修改以下内容:

x = 3;
Run Code Online (Sandbox Code Playgroud)

  • 第一个例子也可以防止意外修改.虽然从调用者的角度来看它是无关紧要的,但有时候声明每个参数和局部变量`const`是非常有帮助的,因为修改它们可能指向错误或设计错误. (2认同)