什么时候应该在 C++ 构造函数参数中使用 const?
When should I use const in C++ constructor parameters?
我对 clean code/coding 风格有疑问,问题是,我什么时候应该在 C++ 构造函数参数中使用关键字 const
。例如,考虑以下 class:
class A {
public:
B& b;
explicit A (const B& b_): b(b_) {}
};
在这段代码中,我想从classA
初始化引用b
,同时,我想表达引用作为参数传递class A
构造函数将不会用于更改对象 b_
的值。但是,提供的代码不会编译,编译器会显示消息:
"error: binding reference of type ‘B&’ to ‘const B’ discards qualifiers"
我知道我可以在 b
class 属性中使用关键字 const
,但是,它会使属性保持不变,我不想将此约束强加于属性。所以,我想知道在这种情况下我该怎么办。
I want to express that the reference passed as a parameter to the class A constructor will not be used to change the values of the object b_.
但事实并非如此。可以修改传递给 A
的构造函数的引用。不是 必须 直接由 A
的构造函数,而是 A
的任何其他修改对象的成员函数。
如果函数通过 const&
获取参数,则该函数的调用者有权期望该对象不会被该函数或任何进程修改 dependent 在该函数的执行上。例如在构造函数中初始化一个引用成员,可以在该构造函数执行后访问。
你应该做的是不要欺骗用户。 A
的构造函数的一个依赖结果是传递给它的参数可能会被修改。所以它应该是一个非const
参考。
同样重要的是,创建 A
的行为从根本上取决于给定对象 在构造函数退出后继续存在 。由于 const&
参数可以绑定到临时参数,因此有人很容易像这样调用您的构造函数 A a(B{})
; a
在这条语句之后引用了一个已经被销毁的对象。如果您的函数采用非 const
引用,这将是一个编译错误。
我对 clean code/coding 风格有疑问,问题是,我什么时候应该在 C++ 构造函数参数中使用关键字 const
。例如,考虑以下 class:
class A {
public:
B& b;
explicit A (const B& b_): b(b_) {}
};
在这段代码中,我想从classA
初始化引用b
,同时,我想表达引用作为参数传递class A
构造函数将不会用于更改对象 b_
的值。但是,提供的代码不会编译,编译器会显示消息:
"error: binding reference of type ‘B&’ to ‘const B’ discards qualifiers"
我知道我可以在 b
class 属性中使用关键字 const
,但是,它会使属性保持不变,我不想将此约束强加于属性。所以,我想知道在这种情况下我该怎么办。
I want to express that the reference passed as a parameter to the class A constructor will not be used to change the values of the object b_.
但事实并非如此。可以修改传递给 A
的构造函数的引用。不是 必须 直接由 A
的构造函数,而是 A
的任何其他修改对象的成员函数。
如果函数通过 const&
获取参数,则该函数的调用者有权期望该对象不会被该函数或任何进程修改 dependent 在该函数的执行上。例如在构造函数中初始化一个引用成员,可以在该构造函数执行后访问。
你应该做的是不要欺骗用户。 A
的构造函数的一个依赖结果是传递给它的参数可能会被修改。所以它应该是一个非const
参考。
同样重要的是,创建 A
的行为从根本上取决于给定对象 在构造函数退出后继续存在 。由于 const&
参数可以绑定到临时参数,因此有人很容易像这样调用您的构造函数 A a(B{})
; a
在这条语句之后引用了一个已经被销毁的对象。如果您的函数采用非 const
引用,这将是一个编译错误。