函数以值的方式返回对象时,可能会调用拷贝构造函数(VS会调用,Linux不会,g++编译器做了优化)。
实例代码:
class CGirl12
{
public:
string m_name;
int m_age;
CGirl12() { m_name.clear(); m_age = 0; cout << "调用了CGirl8()构造函数。\n"; }
CGirl12(const CGirl12& gg) { m_name ="漂亮的" + gg.m_name; m_age = gg.m_age - 1; cout << "调用了CGirl8(const CGirl8 &gg)拷贝构造函数。\n"; }
~CGirl12() { cout << "调用了~CGirl8()\n"; }
void show() { cout << "姓名:" << m_name << ",年龄:" << m_age << endl; }
};
CGirl12 func12()
{
CGirl12 g1;
g1.m_name = "西施"; g1.m_age = 23;
cout <<"对象g1地址:"<< &g1<<endl;
return g1;
}
void main()
{
CGirl12 g2 = func12();
cout <<"对象g2地址:"<<&g2<<endl;
g2.show();
}
Visual Studio 可以发现在vs中,调用了拷贝构造函数,类地址也是不同的
Linux 类地址是一样的,所以没有调用拷贝构造函数,g++编译器做了优化,g++认为没必要重新创建对象,可以不销毁func12()函数中创建的对象g1,在main函数中,换个变量名接受类的返回继续用就行了,更科学
拷贝函数其他细节
? 访问权限必须是public。
? 函数名必须与类名相同。
? 没有返回值,不写void。
? 如果类中定义了拷贝构造函数,编译器将不提供默认的拷贝构造函数。
? 以值传递的方式调用函数时,如果实参为对象,会调用拷贝构造函数。
? 拷贝构造函数可以重载,可以有默认参数。 类名(…,const 类名& 对象名,…){…}
? 如果类中重载了拷贝构造函数却没有定义默认的拷贝构造函数,编译器也会提供默认的拷贝构造函数。
参考视频:哔哩哔哩码农论坛
|