我们已经了解了构造函数,析构函数基本用法,创建一个对象,我们可以调用构造函数进行初始化,要是我们用已知的对象去创建另一个对象呢?
例如:
Tpoint d1(3,5);
Tpoint d2(d1);//考虑考虑
由一个对象初始化另一个对象,系统会调用拷贝构造函数或者默认拷贝构造函数
拷贝构造函数
1:名字与类同名,并且不被指定返回类型
2:只有一个参数,并且为类对象的引用
3:格式
<类名> :: <拷贝构造函数名> (<类名>& <引用名>)
{ }
拷贝构造函数名与类同名
<类名> :: <拷贝构造函数名> (<类名> <引用名>)//无引用时传值会创建
//临时对象,临时对象会调 用拷贝构造函数形成无穷递归
{ }
拷贝构造函数名与类同名
从下面代码分析:
class Tpoint
{
public :
Tpoint(int x, int y);//自定义的构造
Tpoint(const Tpoint& p);//拷贝构造类内声明
Tpoint()
{
cout << "默认构造" << endl;
}
/*void SetPoint(int x,int y);*/
int Xcoord()
{
return X;
}
int Ycoord()
{
return Y;
}
~Tpoint()//析构函数
{
cout << X <<" "<< Y << " 析构 " << endl;
}
private:
int X;
int Y;
};
Tpoint:: Tpoint(int x, int y)
{
X = x;
Y = y;
cout << "自定义构造" << endl;
}
Tpoint::Tpoint(const Tpoint& p)//拷贝构造函数
{
X = p.X;
Y = p.Y;
cout << "Copy_构造" << endl;
}
Tpoint fun(Tpoint w);
Tpoint fun(Tpoint w)//对象作为函数形参 (实参初始化形参调用拷贝构造函数赋初值)
{
cout << "shican" << endl;
int x;
int y;
x = w.Xcoord() + 10;
y = w.Ycoord() + 20;
Tpoint R(x, y);//调用自定义构造函数创建临时对象
return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)
//在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,
}
int main()
{
Tpoint d1(12,20), d2(0,0), d3(3,3);
Tpoint d4(2, 3);
Tpoint d5(d4);
Tpoint P = fun(d5);
d2 = d3;
cout << d5.Xcoord() << " " << d5.Ycoord() << endl;
cout << P.Xcoord() <<" "<< P.Ycoord() << endl;
cout << d2.Xcoord() <<" "<< d2.Ycoord() << endl;
}
从程序运行结果来看,
Tpoint d5(d4);//一个对象初始化另一个对象,系统会调用拷贝构造函数
Tpoint P = fun(d5);
Tpoint fun(Tpoint w)//对象作为函数形参 (实参d5初始化形参w调用拷贝构造函数赋初值)
{
cout << "shican" << endl;
int x;
int y;
x = w.Xcoord() + 10;
y = w.Ycoord() + 20;
Tpoint R(x, y);//调用自定义构造函数
return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)
//在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,
}
临时对象所起的作用详情:
void fun( const Tpoint w)//调用类的拷贝构造函数进行值传递
void fun( const Tpoint& w) //不会调用拷贝构造函数
Tpoint fun( const Tpoint& w)//传参时不会调用
{
.......
return d;//返回时会调用拷贝构造函数生成临时对象
}
Tpoint& fun( const Tpoint& w)//不会调用拷贝构造函数