【问题标题】:Why constructor is not being called in member function of another class in C++?为什么没有在 C++ 中另一个类的成员函数中调用构造函数?
【发布时间】:2014-10-14 09:48:32
【问题描述】:

我有两个班级:AgeAnimal

我认为Age的构造函数应该被调用两次:

  • 第一次上Animal a = Animal(13);
  • 第二次使用a.getAge();(因为Age temp(age); 在函数定义中)

但是...main() 的输出是Age constructor! 而不是Age constructor!Age constructor!,所以看起来这个构造函数只被调用了一次(我检查过它是在构造Animal 对象时调用的。)。 为什么?

这是我的代码:

class Age {
private:
    int value;
public:
    Age(int a) :value(a) { cout << "Age constructor!"; }
};

class Animal {
private:
    Age age;
public:
    Animal(int a) : age(a) {}
    Age getAge() const { Age temp(age); return temp; }
};

void main() {   
    Animal a = Animal(13);

    a.getAge();
}

【问题讨论】:

  • 你有copy elision
  • 顺便说一句,你应该有const Age&amp; getAge() const { return age; }

标签: c++ constructor


【解决方案1】:
Age temp(age);

它是复制构造函数的调用,而不是默认的。因此,编写复制构造函数并为其添加跟踪,如果您想查看,该副本已创建。

【讨论】:

    【解决方案2】:

    getAge() 中的 Age 构造函数调用复制构造函数,在这种情况下是编译器生成的。那里没有调用采用 int 的构造函数。

    还值得注意的是,getAge() 的返回值的构造(几乎可以肯定)被省略了。但同样,省略的构造是复制/移动构造,因此即使没有省略也不会产生输出。

    【讨论】:

      【解决方案3】:

      我们根据现有对象年龄构造新对象临时,因此您需要定义 在你的基类中复制构造函数

      【讨论】:

        猜你喜欢
        • 2014-08-01
        • 2011-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        相关资源
        最近更新 更多