c++ - 将 const 引用传递到构造函数链中

标签 c++ constructor reference constants

我收到以下代码的运行时错误,这是我实际代码的可重现缩减。我确定我没有正确实例化某些东西,但我无法弄清楚它是什么。

#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:...

它应该可以工作。

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

关于c++ - 将 const 引用传递到构造函数链中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6425624/

相关文章:

Java:从 .NET 构造函数转换

c++ - 具有引用数据成员的类的默认构造函数?

c++ - 跟踪移动旋转矩形的角 c++ openGL

c++ - 从 Python 扩展调用 C++ 虚拟成员时崩溃

c# - 如何创建两个行为不同但接收相同数据类型的构造函数?

c++ - 返回引用后数据被删除

c++ - 将为此代码运行复制构造函数吗?

c++ - 类包含复制构造函数和赋值运算符时的继承行为

c++ - 如何在boost C++中操作优先级队列中的元素

c++ - 构造函数中的静态变量,有什么缺点或副作用吗?