为什么复制构造函数的形参必须设置为引用类型
这个已经是老问题了,我就至少看见过n次了。
------------------------------------------------------------------------------------
如果不是引用,
那么参数本身需要 复制 一个对象,
该对象的复制 需要调用 拷贝构造,
拷贝构造的参数又是一个对象, 又是调用拷贝构造 ....
死循环 。。。
class Data
{
int value;
public:
Data():value(0){cout<<"direct init"<<endl;}
Data(int x):value(x){cout<<"int "<<endl;}
Data(const Data & data):value(data.value){cout<<"???????Copy construction"<<endl;}
Data operator=(const Data & data){cout<<"= !!!!!!!!!!construct"<<endl;return data;}
~Data(){cout<<value<<" destruction"<<endl;}
void Increase(){++value;}
};
int _tmain(int argc, _TCHAR* argv[])
{
Data a(1);
Data b = a;
b = a;
a.Increase();
b.Increase();
b.Increase();
b.Increase();
}





class Data
{
int value;
public:
Data():value(0){cout<<"value = "<<value<<", direct init"<<endl;}
Data(int x):value(x){cout<<"value = "<<value<<", int "<<endl;}
Data(const Data & data):value(data.value){cout<<"value = "<<value<<", Copy construction"<<endl;}
Data operator=(const Data & data){cout<<"value = "<<value<<", = construct"<<endl;return data;}
~Data(){cout<<"value = "<<value<<", destruction"<<endl;}
void Increase(){++value;}
};
Data global(99);
Data foo_data(Data arg)
{
Data local = arg;
Data *heap = new Data(global);
*heap = local;
Data pd[4] = {local,*heap};
return *heap;
}
int _tmain(int argc, _TCHAR* argv[])
{
Data da(2);
Data b;
b = foo_data(da);
}
class Person
{
string name;
public:
Person():name(""){cout<<name<<",null default construction"<<endl;}
Person(string na):name(na){cout<<name<<",single argument default construction"<<endl;}
Person(const Person & person):name(string("copy construct ")+person.name){cout<<name<<",single argument default construction"<<endl;}
Person operator=(Person & person)
{
//name = string("=operator") + name;
cout<<name<<",operator= construction"<<endl;
return person;
}
~Person(){cout<<name<<",destruction"<<endl;}
};
Person global("A");
Person fooPerson(Person arg)//Person &arg
{
Person local = arg;
Person *heap = new Person(global);
*heap = local;
return *heap;
}
void adda()
{
Person aaaa = Person("ll");
Person aaa[4] = {Person("AA"),string("BB")};
}
int _tmain(int argc, _TCHAR* argv[])
{
Person per1("B");
Person per2;
per2 = fooPerson(per1);
// adda();
}








class Data
{
int value;
public:
Data():value(0){cout<<"value = "<<value<<", direct init"<<endl;}
Data(int x):value(x){cout<<"value = "<<value<<", int "<<endl;}
Data(const Data & data):value(data.value){cout<<"value = "<<value<<", Copy construction"<<endl;}
Data operator=(const Data & data)
{
value = data.value;
cout<<"value = "<<value<<", = construct"<<endl;
return *this;
}
~Data(){cout<<"value = "<<value<<", destruction"<<endl;}
int GetValue(){return value;}
};
void print(Data *da)
{
cout<<da->GetValue()<<endl;
}
void print1(Data da)
{
cout<<da.GetValue()<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<Data> dvec(5);
cout<<endl;
print(&dvec[0]);
cout<<endl;
print1(dvec[0]);
cout<<endl;
}

class Data
{
int value;
public:
Data():value(0){cout<<"value = "<<value<<", direct init"<<endl;}
Data(int x):value(x){cout<<"value = "<<value<<", int "<<endl;}
Data(const Data & data):value(data.value){cout<<"value = "<<value<<", Copy construction"<<endl;}
Data operator=(const Data & data)
{
value = data.value;
cout<<"value = "<<value<<", = construct"<<endl;
return *this;
}
~Data(){cout<<"value = "<<value<<", destruction"<<endl;}
int GetValue(){return value;}
};
void print(Data *da)
{
cout<<da->GetValue()<<endl;
}
void print1(Data da)
{
cout<<da.GetValue()<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<Data> dvec(5,999);
cout<<endl;
print(&dvec[0]);
cout<<endl;
print1(dvec[0]);
cout<<endl;
}

浙公网安备 33010602011771号