函数声明末尾的“const”是什么意思? [重复]

问题描述 投票:0回答:6

我有一本书,上面写着这样的内容:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};

这是什么意思?

c++ constants function-qualifier
6个回答
1232
投票

“const 函数”(在函数声明后用关键字

const
表示)会使此类函数更改类的数据成员时出现编译器错误。但是,在函数内部读取类变量是可以的,但在该函数内部写入会产生编译器错误。

思考此类“const 函数”的另一种方法是将类函数视为采用隐式

this
指针的普通函数。因此,方法
int Foo::Bar(int random_arg)
(末尾没有 const)会产生像
int Foo_Bar(Foo* this, int random_arg)
这样的函数,并且像
Foo f; f.Bar(4)
这样的调用将在内部对应于像
Foo f; Foo_Bar(&f, 4)
这样的东西。现在在末尾添加 const (
int Foo::Bar(int random_arg) const
) 就可以理解为带有 const this 指针的声明:
int Foo_Bar(const Foo* this, int random_arg)
。由于在这种情况下
this
的类型是 const,因此不可能修改数据成员。

可以放宽“const 函数”不允许函数写入类的任何变量的限制。为了允许某些变量即使在函数被标记为“const 函数”时也可写,这些类变量用关键字

mutable
进行标记。因此,如果一个类变量被标记为可变的,并且“const 函数”写入该变量,那么代码将干净地编译并且该变量可以更改。 (C++11)

与往常一样,在处理

const
关键字时,更改 C++ 语句中 const 关键字的位置具有完全不同的含义。上述
const
的用法仅适用于将
const
添加到函数声明末尾括号后的情况。

const
是 C++ 中过度使用的限定符:与指针结合使用时,语法和排序通常并不简单。关于
const
正确性和
const
关键字的一些阅读:

常量正确性

C++“const”声明:为什么以及如何


72
投票

考虑两个类类型变量:

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object

现在您可以在 Boo 上调用

b0
任何
成员函数,但只能在
const
上调用
b1
限定的成员函数。


21
投票

Bar
保证不会更改正在调用的对象。例如,请参阅 C++ FAQ 中有关 const 正确性的部分。


14
投票
类似于

这个问题。

本质上,这意味着方法

Bar

不会修改
Foo的非mutable
成员变量。


10
投票
我总是发现从概念上更容易想到你正在将 this 指针设置为常量(这几乎就是它的作用)。


9
投票
函数无法通过您提供的指针/引用更改其参数。

每次需要思考时我都会转到此页面:

http://www.parashift.com/c++-faq-lite/const- Correctness.html

我相信 Meyers 的《更有效的 C++》中也有一个很好的章节。

© www.soinside.com 2019 - 2024. All rights reserved.