深拷贝与浅拷贝。
#include <iostream>
using namespace std;
#include <string>
//Example 1(浅拷贝)——正确
class Person
{
public:
Person(int age):m_age(age)
{
}
void print()
{
cout << "My age is:" << m_age << endl;
}
private:
int m_age;
};
int main()
{
Person Tom(10);
Tom.print();//My age is 10
Person Jim(Tom);
Jim.print();//My age is 10
return 0;
//没有定义相应的拷贝构造函数,编译器将会自动生成一个默认的拷贝构造函数。
//默认拷贝构造函数所做的工作是,将一个对象的全部数据成员赋值给另一个对象的数据成员。
//C++把只对象数据成员简单赋值这种情况称为“浅拷贝”。
}
//Example 2(浅拷贝)——错误
class Person
{
public:
Person(int age,char* name)
{
m_age = age;
m_name = new char[strlen(name)+1];
if(m_name != NULL)
{
strcpy(m_name,name);
}
cout << m_name << "的构造函数" << endl;
}
~Person()
{
cout << "析构姓名:" << m_name << endl;
if(m_name != NULL)
{
delete m_name;
}
}
void print()
{
cout << "My age is:" << m_age << ",my name is:" << m_name << endl;
}
private:
int m_age;
char* m_name;
};
int main()
{
Person Tom(10,"Tom");//构造Tom
Tom.print();
Person Jim(Tom);//构造Jim,只是将Tom的成员(Tom.m_age,Tom.m_name)简单赋值给Jim相应的成员。
Jim.print();
//Jim先析构,再析构Tom时出问题了!Tom.m_name和Jim.m_name指向同一内存空间
//因为这段内存空间在Jim的析构函数中已经释放过了,在释放Tom.m_name所指的内存空间时会出现问题
return 0;
}
//Example 3(深拷贝)——正确
class Person
{
public:
Person(int age,char* name)
{
m_age = age;
m_name = new char[strlen(name)+1];
if(m_name != NULL)
strcpy(m_name,name);
cout << m_name << "的构造函数" << endl;
}
Person(const Person& per)
{
m_age = per.m_age;
m_name = new char[strlen(per.m_name)+1];
if(m_name != NULL)
strcpy(m_name,per.m_name);
cout << m_name << "的拷贝构造函数" << endl;
}
~Person()
{
cout << "析构姓名:" << m_name << endl;
if(m_name != NULL)
delete m_name;
}
void print()
{
cout << "My age is:" << m_age << ",my name is:" << m_name << endl;
}
private:
int m_age;
char* m_name;
};
int main()
{
Person Tom(10,"Tom");//构造Tom
Tom.print();
Person Jim(Tom);//构造Jim
Jim.print();
//析构Jim,再析构Tom
return 0;
}
//深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,
//资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。实际中应该避免浅拷贝。