话不多说,先写一个简单的例子:
using namespace std;
class people
{
public:
string juzi;
people()
{
cout << "调用了people类的默认构造函数" << endl;
}
people(string ju)
{
juzi = ju;
cout << "调用了people类的people(string ju)构造函数" << endl;
}
people(people& dx)
{
juzi = dx.juzi;
cout << "调用了people类的people(people& dx)构造函数" << endl;
}
};
class boy
{
public:
string name;
int age;
people& dx;
boy(string na, int ag,people&d) :name(na), age(ag), dx(d)
{
cout << "调用了 boy(string na, int ag, people& d)构造函数" << endl;
}
void show()
{
cout << "姓名:" << name << endl;
cout << "年龄:" << age << endl;
cout << "介绍:" << dx.juzi << endl;
}
};
int main()
{
people xiaoming("你好");
people zhongjian(xiaoming);
boy nan("小明", 16, zhongjian);
nan.show();
}
运行结果:
先创建people类对象xiaoming,调用了拷贝构造函数(拷贝构造函数即括号内存在形参的构造函数,构造对象时或函数以值方式返回对象时调用)people(string ju),变量ju将赋值给变量juzi,然后创建zhongjian对象时将对象xiaoming作为实参传入,将调用people(people&dx)拷贝构造函数,zhongjian对象juzi的值将和xiaoming的相等。后面在创建boy类对象时,由于boy类成员有people类的对象,boy类对象就可以访问其他类的数据了。
浅拷贝:
浅拷贝指的是拷贝的时候,直接将旧对象成员的地址给了新对象导致新对象在赋值时会改变旧对象成员的值。
using namespace std;
class people
{
public:
string juzi;
people()
{
cout << "调用了people类的默认构造函数" << endl;
}
people(string ju)
{
juzi = ju;
cout << "调用了people类的people(string ju)构造函数" << endl;
}
people(people& dx)
{
juzi = dx.juzi;
cout << "调用了people类的people(people& dx)构造函数" << endl;
}
};
class boy
{
public:
string name;
int age;
int* p;
boy() {};
boy(string na, int ag) :name(na), age(ag)
{
cout << "调用了 boy(string na, int ag, people& d)构造函数" << endl;
}
void show()
{
cout << p << endl;
cout << *p << endl;
};
boy(boy& ob)
{
p = ob.p; *p = *(ob.p);
};
};
int main()
{
boy jiu;
jiu.p=new int(2);
boy xin(jiu);
cout << "新对象p指针地址和内容:" << endl;
xin.show();
cout << "旧对象p指针地址:" << jiu.p << endl;
*(xin.p) = 35;
cout << "旧对象p指针地址和内容:" << endl;
jiu.show();
}
运行结果:
不难看出,浅拷贝的时候,旧对象的指针地址和新对象的指针地址是一样的,当新对象指针指向的内容发生改变时,旧对象的内容也会发生对应的变化。
深拷贝:
深拷贝与浅拷贝对应,是在拷贝的时候为新对象的指针new一个新地址出来再将旧对象的值复制过来,完成拷贝。
using namespace std;
class people
{
public:
string juzi;
people()
{
cout << "调用了people类的默认构造函数" << endl;
}
people(string ju)
{
juzi = ju;
cout << "调用了people类的people(string ju)构造函数" << endl;
}
people(people& dx)
{
juzi = dx.juzi;
cout << "调用了people类的people(people& dx)构造函数" << endl;
}
};
class boy
{
public:
string name;
int age;
int* p;
boy() {};
boy(string na, int ag) :name(na), age(ag)
{
cout << "调用了 boy(string na, int ag, people& d)构造函数" << endl;
}
void show()
{
cout << p << endl;
cout << *p << endl;
};
boy(boy& ob)
{
p = new int; *p = *(ob.p);
};
};
int main()
{
boy jiu;
jiu.p=new int(2);
jiu.age = 18;
boy xin(jiu);
cout << "新对象p指针地址和内容:" << endl;
xin.show();
cout << "旧对象p指针地址:" << jiu.p << endl;
*(xin.p) = 35;
cout << "旧对象p指针地址和内容:" << endl;
jiu.show();
}
运行结果:
和浅拷贝相比,深拷贝中旧对象指针指向的内容不会随着新对象指针改变而改变 ,而且新旧对象中p指针的地址是不同的。
本文章主要回顾的知识点有:拷贝构造函数,浅拷贝,深拷贝