我对干净的代码/编码风格有疑问,问题是,我什么时候应该在构造函数参数中使用关键字const
C++。例如,考虑以下类:
class A {
public:
B& b;
explicit A (const B& b_): b(b_) {}
};
在这个代码中,我想初始化来自类A
的引用b
,同时我想表达的是,作为参数传递给类A
构造函数的引用不会用于更改对象b_
的值。但是,呈现的代码将无法编译,编译器将显示以下消息:
"error: binding reference of type ‘B&’ to ‘const B’ discards qualifiers"
我知道我可以在b
class 属性中使用关键字const
,但是,它会使属性保持不变,我不想在属性上施加此约束。所以,我想知道在这种情况下我应该怎么做。
表达的是,作为参数传递给类 A 构造函数的引用不会用于更改对象b_的值。
但事实并非如此。传递给A
构造函数的引用是可以修改的。不一定直接由A
的构造函数,而是由修改对象的任何其他A
成员函数。
如果一个函数通过const&
获取参数,则该函数的调用者有权期望该对象不会被该函数或任何依赖于该函数执行的进程修改。例如初始化构造函数中的引用成员,该成员可以在该构造函数执行后访问。
你应该做的是不要对用户撒谎。A
的构造函数的一个相关结果是传递给它的参数可能会被修改。所以它应该是一个非const
参考。
同样重要的是,创建A
的行为从根本上取决于给定对象在构造函数退出后继续存在。由于const&
参数可以绑定到临时参数,因此有人很容易像这样调用您的构造函数A a(B{})
; 在此语句之后a
引用已销毁的对象。如果您的函数采用非const
引用,这将是一个编译错误。