拷贝构造函数的调用时机:
1.用一个已经创好的对象来初始化一个新对象
2.用值传递来给形参传值的时候
3.以值传递的方式返回局部对象都是利用拷贝构造函数的形式
分别用三个测试案例来举例
#include<iostream>
using namespace std;
class person
{public:
person()//person的无参构造函数
{
}
person(int a)//person的有参构造函数
{
m_age = a;
}
~person()//不允许有参数,所以不可以发生重载
//person的析构函数
{
}
person(const person& p)
{//person的拷贝构造函数
m_age = p.m_age;
cout << "拷贝构造函数的应用" << endl;
}
int m_age;
};
void test01()
{//拷贝构造函数的调用时机1.用一个已经创好的对象来初始化一个新对象
person p1(10);
person p2(p1);
cout << "p2 的年龄为" << p2.m_age << endl;
}
void dowork(person p)
{
cout << "今天天气真好" << endl;
}
void test02()
{//拷贝构造函数的调用时机2.用值传递来给形参传值的时候
person p;
dowork(p);
}
person test03()
{//拷贝构造函数的调用时机3.以值传递的方式返回局部对象都是利用拷贝构造函数的形式
person p;
cout << "person p的地址为" << &p << endl;
return p;
}
void test04()
{
person p5=test03();
cout << "person p5的地址为" << &p5 << endl;
}
//注意由test04()和test05()的出来的结论:
//返回局部对象的时候是利用复制拷贝函数
//因为两个的地址不一样,不是同一个函数
//所以利用的是拷贝构造函数
int main(void)
{
test01();
cout << endl;
test02();
cout << endl;
test04();
cout << endl;
system("pause");
// system("PAUSE");和system("pause");作用和效果一样,因为dos命令是不区分大小写的。
//system("PAUSE") 是暂停的意思,等待用户信号;不然控制台程序会一闪即过,你来不及看到执行结果。*/
// return 0;//程序运行成功会返回一个0
}