Const引用有时会导致混淆
Const references sometimes lead to confusion
我是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
(,这会被推荐/劝阻吗?
谢谢。
EDIT:为了澄清我困惑的原因,我经常听到人们说"当函数承诺不更改参数时使用const-refs">,但"更改参数">到底是什么意思?这是否意味着函数承诺不向参数分配新对象,还是意味着它不会改变对象的状态?当然,const
引用不允许这两种更改,但对于const
引用,主要关注的是什么是因为它不会为参数分配新值,还是因为它不会改变const
引用所引用对象的状态?
通过const Foo &
void Bar::doSomethingWith(const Foo &foo)
承诺不修改CCD_ 19。因此,它可能不会调用它的非常量incrementX
方法。
如果您有Bar::doSomethingWith(Foo &foo)
需要调用foo.incrementX
(因此需要采用它的参数非常量引用(,那么您应该重新考虑作为Bar
的方法而不是Foo
的方法是否真的合适。
如果您希望更改对象,请不要传递const引用,或者重载函数以获得doSomethingWith(const Foo&)
和doSomethingWith(Foo&)
。
整个想法是通过const
引用强制const
行为,因此您只能调用标记为const
的成员函数,从长远来看,这会减少问题。
附言:我让doSomething
成为Foo
的一员。
示例:
#include <iostream>
using namespace std;
class Foo
{
int m=0;
public:
void doSomething(const Foo& foo) const
{
cout << "calling const reference" << endl;
}
void doSomething(Foo& foo)
{
cout << "calling reference" << endl;
foo.m++;
}
};
int main()
{
const Foo f,g ;
f.doSomething(g); // calls const reference
Foo h,k;
h.doSomething(k); // calls reference
}
- 在 const 函数中通过引用和指针返回之间的区别
- 使用对const结构的const数组的引用进行构造
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 在C++17中,引用const字符串的语义应该是什么
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 将返回类型专用化为 void 或 const 左值引用
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 在 C++ 中通过引用传递类成员时,Const 不起作用
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- const TYPE&- 我什么时候想通过引用 const 来使用?
- 指针引用const null值
- 三元运算符和通过引用const延长临时对象的生存期
- 为什么必须引用const来避免复制形参?