【发布时间】:2020-10-18 23:58:24
【问题描述】:
我有 Foo 类,它的成员 bar_ 是指向某些数据的指针。方法modify 修改数据,但不修改指针本身。因此我可以将方法声明为 const:
class Foo {
public:
Foo() : bar_(new double) {};
void modify() const {*bar_ += 1;};
private:
double *bar_;
};
如果我将方法声明为const,它将可以从其他的const方法访问,这样更灵活。同时,我可以删除 const 作为对其他开发人员和用户的提示,该方法间接修改数据(并假设数据归类所有)。所以我在这里有一个选择:将modify 声明为const 或删除const:void modify() const 或void modify()。
每种方法的优缺点是什么?指导方针是怎么说的?我该怎么办?
【问题讨论】:
-
这里没有普遍的规律来说明类方法应该或不应该在哪里
const。这由您决定。 -
类可以有
mutable成员,const函数可以 修改。一个函数是否应该是const真的取决于它是否是“逻辑上的 const”——不会以任何有意义的可观察方式修改对象。 -
根据 Herb Sutter 的说法,对于现代 C++,const 也应该对于多线程是健壮的。因此,使用 const 具有可变状态应该是安全逻辑 const 的有力保证。这还需要更多的工作,例如使用原子或互斥保护。
-
@Eljay 至少这通常是一个好主意,因为多线程是一回事。尽管如此,不使组件线程安全可以显着节省成本。
标签: c++ constants shallow-clone