【发布时间】:2017-02-09 19:06:40
【问题描述】:
const 关键字应该用在类方法上,表示调用对象没有被这个方法修改。但是后者的确切语义是什么?我可以想到三个选项:一个类方法应该是 const 当且仅当
- (最弱)它不修改对象存储的位和字节
- (更强)它不会修改对象(如 1 中),也不会修改对象拥有的引用对象
- (最强)它不会修改对象,也不会修改它引用的任何对象(无论它是否拥有)
什么是“正确”的方式?编程界是否有共识?
例如,标准库的容器 const 语义显然至少满足 2。另一方面,奇怪的是,std::unique_ptr 的 * 运算符甚至不满足 2:它是 const 但返回指向对象的非常量引用,尽管该对象属于 std::unique_ptr 对象根据定义。
另一个例子:
class X
{
private:
int& intref;
public:
X(int& intref): intref(intref) {};
void modifyRef(int& another) const
{
this->intref = another;
}
};
在 2 之后,方法上的 const 没问题,因为 intref 引用了不属于对象的东西。在 3 之后,应该删除 const。
【问题讨论】:
-
"类方法上应使用 const 关键字,表示调用对象未被此方法修改。" -- 错误。表示调用的对象没有被该方法修改。
-
我会再往下一层,0(logical const-ness) 你在哪里不透明地修改对象状态。
-
@gjha 这不是向下一级,而是横向一步。
-
this->intref = another不会重新赋值引用,而是赋值给被引用的变量,another应该按值传递。