为什么复制构造函数的形参必须设置为引用类型 

这个已经是老问题了,我就至少看见过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;
}

 

posted on 2014-10-31 10:46  风云逸  阅读(49)  评论(0)    收藏  举报