拷贝初始化构造函数
拷贝初始化构造函数是一种特殊的成员函数,它的功能是用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数,它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。
拷贝衩始化构造函数的特点如下:
1、该函数名同类名,因为它也是一种构造函数,并且该函数也不被指定返回类型。
2、该函数只有一个参数,并且是对某个对象的引用。
3、每个类都必须有一个拷贝初始化构造函数,其格式如下:
<类名>::<拷贝初始化构造函数名>(const<类名>&<引用名>)
其中,<拷贝初始化构造函数名>是与该类名相同的。const是一个类型修饰符,被它修饰的对象是一个不能被更新的常量。
如果类中没有说明拷贝初始化构造函数,则编译系统自动生成一个具有上术形式的缺省拷贝初始化构造函数。作为该类的公有成员。
下面举一例子说明拷贝初始化构造函数
class TPoint
{
public:
TPoint(int x, int y) {X=x; Y=y;}
TPoint(TPoint & p);
~TPoint() {cout<<"析构函数被调用。\n";}
int Xcoord() {return X;}
int Ycoord() {return Y;}
private:
int X, Y;
};
TPoint::TPoint(TPoint & p)
{
X = p.X;
Y = p.Y;
cout<<"拷贝初始化构造 函数被调用。\n";
}
#include
void main()
{
TPoint P1(5, 7);
TPoint P2(P1);
cout<<"P2="<
}
该程序的输出结果为:
拷贝初始化构造函数被调用。
P2=5,7
析构函数被调用。
析构函数被调用。
关于拷贝初始化构造函数的其他用法,可从下例看出:
#include
#include "tpont.h" //类的定义放于该文件中
TPoint f(TPoint Q);
void main()
{
TPoint M(20, 35),P(0, 0);
TPoint N(M);
P = f(N);
cout<<"P="<
}
TPoint f(TPoint Q)
{
cout<<"ok\n";
int x, y;
X = Q.Xcoord()+10;
Y = Q.Ycoord()+20;
TPoint R(x, y);
return R;
}
请大家自行调试该程序,并分析其结果。
总结:拷贝初始化构造函数的功能就是用一个已知的对象来初始化另一个对象。在下述三种情况下,需要用拷贝初始化构造函数来用一个对象初始化另一个对象。
1、明确表示由一个对象初始化另一个对象时,如:TPoint P2(P1);
2、当对象作为函数实参传递给函数形参时,如:上例 P = f(N);
3、当对象用为函数返回值时,如:上例 return R;