拷贝构造函数
拷贝构造函数在三种情况下会被使用
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赋值,因此其调用的就是赋值语句。
运行结果