拷贝构造函数与赋值函数(运算符重载)(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赋值,因此其调用的就是赋值语句。
运行结果
不积小流无以成江河