将const引用传递给构造函数链

时间:2011-06-21 13:01:46

标签: c++ constructor reference const

我使用以下代码收到运行时错误:

#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”

2 个答案:

答案 0 :(得分:12)

问题出在这一行: C::C(const A& anA) : myA(anA), myB(myA) {}
myB是一个参考。但到了什么?答案是暂时的。 myB(myA)将构造一个分配给您的引用的临时对象。不幸的是,这个物体将在Ctor退出后被摧毁 将您的代码更改为以下内容:

class C {
const A& myA;
const B myB;

public:...

它应该有效。

顺便说一句:我几乎总是用一个参数声明构造函数是显式的。这样做,编译器会警告你。

答案 1 :(得分:0)

你试图通过引用D :: myA初始化D :: myC,这是不正确的,因为此时对象还没有完全构建。

D::D(const int k) : myA(k), myC(myA) {}