什么时候调用拷贝构造函数
1. 当用类的一个对象去初始化该类的另一个对象时,系统会自动调用拷贝构造函数
例如 Human h2(h1)和Human h2=h1。注意是初始化不是赋值,如果h2已经初始化,然后用h2=h1的话相当于将h1赋值给h2,这时候调用的是赋值构造函数.
2. 将一个对象作为实参传递给一个非引用类型的形参,系统会自动调用拷贝构造函数
Human& test6(Human man) {
return man;
}
Human h1;
test6(h1);
3 从一个返回类为非引用的函数返回一个对象时,系统会自动调用拷贝构造函数
Human test5(Human &man) {
return man;
}
Human h1;
test5(h1);
拷贝构造函数如下
Human::Human(const Human& man) {
cout << "调用自定义的拷贝构造函数" << "参数:" << &man
<< " 本对象:" << this << endl;
age = man.age; //this是一个特殊的指针,指向这个对象本身
salary = man.salary;
name = man.name;
// 深度拷贝
addr = new char[64];
strcpy_s(addr, 64, man.addr);
}
根据上面描述的拷贝构造函数调用时机,我们可以判断他们的调用拷贝构造函数的情况如下
但是当我们运行的时候会发现Human h3 = test5(h1);这行代码只调用一次
扫描二维码关注公众号,回复:
17025924 查看本文章
这是因为返回类为非引用的函数返回一个对象时,赋值给另外一个对象时编译器会优化,这时候返回值的时候调用拷贝构造函数,但是赋值给对象不会调用拷贝构造。