我何时应该在C ++构造函数参数中使用const?

问题描述 投票:0回答:1

我对干净的代码/编码风格有疑问,疑问是,何时应该在C ++构造函数参数中使用关键字const。例如,考虑以下类:

class A {
    public:
    B& b;
    explicit A (const B& b_): b(b_) {}
    };

在此代码中,我想从类b初始化引用A,同时,我想表示将不使用作为参数传递给类A构造函数的引用更改对象b_的值。但是,显示的代码将无法编译,并且编译器将显示以下消息:

"error: binding reference of type ‘B&’ to ‘const B’ discards qualifiers"

[我知道我可以在const类属性中使用关键字b,但是,它将使属性不变,并且我不想对此属性施加约束。因此,我想知道在这种情况下该怎么办。

c++ coding-style
1个回答
0
投票

我想表达的是,作为参数传递给类A构造函数的引用将不会用于更改对象b_的值。

但是那不是真的。传递给A的构造函数的引用可以修改。不是必要]由A的构造方法直接进行,而是由A的其他任何修改对象的成员函数进行。

[如果函数通过const&接受参数,则该函数的调用者有权期望该函数或执行该函数的任何进程取决于

不会修改该对象。例如初始化构造函数中的引用成员,该引用成员可以在该构造函数执行后访问。

您不应该对用户撒谎。 A的构造函数的从属结果是可以修改传递给它的参数。因此,它应该是非const引用。

同样重要的是,在构造函数退出后,创建A的行为基本上取决于给定的对象继续存在

。由于const&参数可以绑定到临时变量,因此有人像A a(B{})这样调用您的构造函数将非常容易;此语句后的a引用已损坏的对象。如果您的函数采用了非const引用,则可能是编译错误。
© www.soinside.com 2019 - 2024. All rights reserved.