【发布时间】:2014-07-29 14:00:44
【问题描述】:
我是 C++ 新手。我了解到应尽可能使用引用,并且仅在绝对必要时才应使用指针。我还了解到,当函数不改变引用变量时,应该在函数参数中使用const引用。
我理解其中的原因并同意他们的观点,但有一种常见情况是 const 引用会导致混淆,即可变对象“变得不可变”作为声明 const 引用的效果(常量)到一个对象。例如,Foo 类有一个名为incrementX() 的方法,它在调用时会改变Foo 的状态:
class Foo {
public:
void incrementX();
private:
private int x;
}
void Foo::incrementX() {
x++;
}
class Bar {
public:
void doSomethingWith(const Foo &foo);
}
void Bar::doSomethingWith(const Foo &foo) {
foo.incrementX(); // <- illegal because incrementX() is not a const method
}
int main() {
Foo foo;
Bar bar;
bar.doSomethingWith(foo);
}
通常的解决方案是将incrementX() 声明为const 方法,这反过来又迫使我将变量x 声明为mutable 变量。问题是,通过将incrementX() 转换为const 方法,我是说这个方法不应该改变对象的状态,这在上面的例子中是不正确的。不仅不正确,而且该方法的意图也是改变对象的状态。
我很好奇有经验的 C++ 程序员如何处理这种情况。在这种情况下,我倾向于使用 const 指针 (Foo * const foo),是否会推荐/不鼓励这样做?
谢谢。
编辑:为了澄清我困惑的原因,我经常听到人们说“当函数承诺不更改参数时使用 const refs”,但是什么究竟“改变参数”是什么意思?这是否意味着该函数承诺不会将新对象分配给参数,或者是否意味着它不会改变对象的状态?当然,const 引用不允许这两种更改,但是 const 引用的主要问题是什么? 是它不会为参数分配新值,还是它不会改变const 引用所引用的对象的状态吗?
【问题讨论】:
-
如果您需要调用者恢复修改,请使用非常量引用。如果不是,则按值传递。
-
如果函数要修改它的参数,那么参数不应该是
const。 -
修改其参数是什么意思?是用另一个Foo实例替换
foo还是改变foo的状态? -
@le_ninja_sloth:表示修改其任意非
mutable成员,或调用任意非const成员函数。 (C++ 中没有“替换对象”的概念;我假设您的意思是“用另一个值赋值”,这是通过调用非const赋值运算符来完成的。) -
@MikeSeymour 这正是我所说的“替换对象”的意思,抱歉我选错了词。好的,现在我明白了。当我听到人们说“当你的函数承诺不更改参数时使用 const refs” 我认为他们的意思是函数承诺不会为参数分配新值。
标签: c++ pointers reference constants