1.拷贝构造函数书写:
Person(const Person &p)
{
m_age=p.m_age;
cout<<"Person拷贝构造函数调用"<<endl;
}
2.拷贝构造函数调用时机:
a.使用一个已经创建完毕的对象来初始化一个新对象
Person p1(20);
Person p2(p1);
b.值传递的方式给参数传值
void test(Person p) //注意改变p并不改变下面的p1
{
p.m_age=20;
}
Person p1;
test(p1);
c.值方式返回局部变量
Person work()
{
Person p1;
return p1;
}
3.构造函数调用规则:
默认情况下,c++编译器会至少给一个类提供三个函数:
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数(值拷贝)
如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造
如果用户定义拷贝构造函数,c++不再提供其他构造函数
4.浅拷贝:“=”赋值均为浅拷贝,所以有指针时需要自己写拷贝构造函数
深拷贝:
Person(int height)
{
m_height= new int(height); //new int(int x)返回一个指针,指向在堆区创建的一个新数据,该数据值为height
}
~Person()
{
if(m_height!=NULL)
{
delete m_height; //因为在堆区开辟的数据系统不会自动释放,所以在不用后应该由程序员手段释放
m_height=NULL;
}
}
int *m_height; //定义一个指针类型,一会儿接受在堆区开辟的数据的地址,若浅拷贝则会导致堆区的内存重复释放,所以就要自己写拷贝函数,用深拷贝。
Person(const Person &p)
{
m_height=new int (*p.m_height);
}