将const引用向下传递到构造函数链中
Passing a const reference down a chain of constructors
我在下面的代码中遇到了一个运行时错误,这是我实际代码的可复制缩减。我确信我没有正确地实例化某个东西,但我无法弄清楚它是什么
#include <iostream>
using namespace std;
class A {
int n;
public:
A();
A(const int k);
int getn() const { return n; };
};
A::A() : n(0) {};
A::A(const int k) : n(k) {}
class B {
const A& myA;
public:
B(const A& anA);
int getn() const { return myA.getn(); };
};
B::B(const A& anA) : myA(anA) {}
class C {
const A& myA;
const B& myB;
public:
C(const A& anA);
int getn() const { return myB.getn(); };
};
C::C(const A& anA) : myA(anA), myB(myA) {}
class D {
A myA;
C myC;
public:
D(const int k);
int getAn() const { return myA.getn(); };
int getCn() const { return myC.getn(); };
};
D::D(const int k) : myA(k), myC(myA) {}
int main() {
D myD(10);
cerr << "A: " << myD.getAn() << 'n';
cerr << "C: " << myD.getCn() << 'n';
}
我要么在输出的第二行上得到分段错误;C: 0";,而不是";C: 10〃;这是我所期望的。
问题就在这一行:C::C(const A& anA) : myA(anA), myB(myA) {}
myB是一个参考。但是去了什么?答案是暂时的。myB(myA)
将构造一个临时对象,该对象被指定给您的引用。遗憾的是,此对象将在Ctor退出后被销毁
将您的代码更改为以下内容:
class C {
const A& myA;
const B myB;
public:...
它应该起作用。
BTW:我几乎总是将带有一个参数的构造函数声明为显式的。这样做,编译器会警告您。
您正试图参照D::myA初始化D::myC,这是不正确的,因为对象目前还没有完全构造好。
D::D(const int k) : myA(k), myC(myA) {}
相关文章:
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 何时应在构造函数参数中使用 const C++?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- 如何在构造函数中传递 const 引用时强制编译器不接受右值
- C++将派生类的const值传递给基意外行为的构造函数
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- C++:使用委托构造函数时选择"const char *"与"std::string&qu
- 具有字符串文本构造函数的类不适用于 const 引用初始化
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- C++ 在头文件或构造函数中初始化 const 类成员变量?
- 在没有构造函数的情况下初始化 const c++ 类
- 使用 const T(&x)[N][M] 构造函数类矩阵
- 为什么即使参数标记为"const",也会调用复制构造函数?
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 在复制构造函数中使用和不使用 const 有什么区别
- 构造函数"const variables"设置的用于表示C++数组的边界?
- 复制构造函数const char*和Shared_ptr