为什么在C++中的另一个类的成员函数中没有调用构造函数
Why constructor is not being called in member function of another class in C++?
我有两个类:Age
和Animal
。
我认为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();
}
Age temp(age);
它是对复制构造函数的调用,而不是默认调用。所以,编写复制构造函数并向其添加跟踪,如果您想查看该副本是否已创建。
getAge()中的Age构造函数调用复制构造函数,该构造函数在本例中是编译器生成的。没有在那里调用采用int的构造函数。
同样值得注意的是,getAge()的返回值构造(几乎可以肯定)被省略了。但同样,被省略的构造是复制/移动构造,因此即使没有被省略,也不会产生任何输出。
我们根据现有的对象年龄构建新的对象临时,因此需要定义复制基类中的构造函数
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参