拷贝构造函数与赋值函数(运算符重载)(1)

拷贝构造函数
拷贝构造函数在三种情况下会被使用
1.使用对象来初始化对象时
2.当函数的形参是对象时
3.当函数的返回值为对象时
 2,3情况的本质还是1

//Test1.h
#include<iostream>
using namespace std;
class ST
{
private:
	int a;
	long b;
public:
	ST(int a=0, long b=0):a(a),b(b)
	{
		cout<<"Object was built. "<<this<<endl;
	}
	ST(const ST &t);	//拷贝构造函数
	~ST()
	{
		cout<<"Object was free. "<<this<<endl;
	}
	ST& operator=(const ST &t);
};

ST& ST::operator=(const ST &t)//赋值函数,或者叫=号运算符的重载
{
	cout<<"Assign: "<<this<<" = "<<&t<<endl;
	if(this != &t)
	{
		this->a = t.a;
		this->b = t.b;
	}
	return *this;
}
ST::ST(const ST &t)
{
	cout<<"Object was copy. "<<this<<endl;
	this->a = t.a;
	this->b = t.b;
}

类中无明确的拷贝构造函数时系统会默认的提供一个拷贝构造函数

#include<iostream>
#include"Test1.h"
using namespace std;

ST Get_obj(ST t)//传参时将参数拷贝一份给了函数,由于参数是对象,所以实际上还是使用对象来初始化对象。所以这是第一次拷贝
{				
	ST t1(t);	//使用对象来初始化对象,第二次拷贝
	return t1;	//返回值的生存作用域仅在此函数内,传值时传递的是t1的拷贝,又一次使用对象初始化对象,第三次拷贝
}				//所以此函数调用了三次拷贝构造函数
void main()
{
	ST st(10, 20);
	ST st1 = st;//此处调用了拷贝构造函数①
	ST st2(st);//此处调用了拷贝构造函数
	ST st3;
	st3 = st;//此处调用的是赋值语句②
	cout<<"##########################"<<endl;
	ST st4 = Get_obj(st);//此过程共调用三次拷贝构造函数,看起来st4的初始化也得使用拷贝构造,实则不然,由于Get_obj()方法返回的已经是一个被拷贝构造的临时对象,其可以直接为st4赋值,而不需要再次拷贝构造
}

①和②看起来虽然都是使用对象为对象赋值,但是其不同点在于,①中st1直接使用对象初始化,所以其调用的就是拷贝构造,

②时st3先进行了初始化,再用st赋值,因此其调用的就是赋值语句。

运行结果

posted @ 2019-01-27 09:52  C_hp  阅读(660)  评论(0编辑  收藏  举报