调用拷贝构造函数的三种情况:
1>用已经存在的对象初始化另一个对象
2>对象作为实参传递给形参
3>对象作为函数返回值
>浅拷贝:就是指针的拷贝,通过拷贝过来的指针来之向某个地址
>深拷贝:若类中成员属性有指针成员数据类型时,此时要开辟好一块儿真是的空间然后指针指向它,而不是直接拷贝指针
#include <iostream>
using namespace std;
class Personlist{
public:
Personlist(){}
Personlist(const Personlist &p);
private:
string *namelist;
int size_;
};
Personlist :: Personlist(const Personlist &p){ //这里就是申请一块儿空间
if(p.namelist != NULL){
namelist = new string[size_ = p.size_];
for(int i = 0; i < size_; i++){
namelist[i] = p.namelist[i];
}
}
}
Personlist :: Personlist(const string new_name[], int new_size){
size_ = new_size;
namelist = new string[size_];
for(int i = 0; i < new_size; i++)
namelist[i] = new_name[i];
}
int main()
{
string namelist[3] = {"Tom", "Jack", "Allen"};
Personlist p1(namelist, 3);
Personlist p2(p1); //这里会调用拷贝构造函数
return 0;
}
==================================================
//这里若将自定义的拷贝构造函数删掉,那么就可以看出对其中一个对象的namelist成员属性改变,必会影响另一个对象(系统自动调用的拷贝构造函数是浅拷贝)
#include <iostream>
using namespace std;
class Personlist{
public:
Personlist(){}
Personlist(const Personlist &p);
Personlist(const string new_name[], int new_size);
void set_name(const string &new_name, int i);
void disp();
private:
string *namelist;
int size_;
};
void Personlist :: set_name(const string &new_name, int i){
namelist[i] = new_name;
}
Personlist :: Personlist(const Personlist &p){
if(p.namelist != NULL){
namelist = new string[size_ = p.size_];
for(int i = 0; i < size_; i++){
namelist[i] = p.namelist[i];
}
}
}
Personlist :: Personlist(const string new_name[], int new_size){
size_ = new_size;
namelist = new string[size_];
for(int i = 0; i < new_size; i++)
namelist[i] = new_name[i];
}
void Personlist :: disp(){
cout << "The names are";
for(int i = 0; i < size_; i++){
cout << namelist[i] << "\t";
}
cout << endl;
}
int main()
{
string namelist[3] = {"Tom", "Jack", "Allen"};
Personlist p1(namelist, 3);
Personlist p2(p1);
cout << "改变之前" << endl;
p1.disp();
p2.disp();
p2.set_name("Peter", 1);
cout << "改变之后" << endl;
p1.disp();
p2.disp();
cout << endl;
return 0;
}
总结:一般类中有指针成员的数据类型,那么类中的赋值语句和拷贝构造函数就需要重新编写,不能使用默认的函数,杜绝浅拷贝