请帮我看一下这个关于拷贝构造函数的问题 谢谢

来源:百度知道 编辑:UC知道 时间:2024/07/08 04:00:57
请问下这里的这个拷贝构造函数具体起到什么作用 如果不写这个拷贝构造函数会怎么样?
#include<iostream>
using namespace std;
class Point
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;countP++;}
Point(Point &p);
~Point(){countP--;}
int GetX(){return X;}
int GetY(){return Y;}
void GetC(){cout<<"object id="<<countP<<endl;}
private:
int X,Y;
static int countP;
};
Point:: Point(Point &p)
{
X=p.X;
Y=p.Y;
countP++;
}
int Point::countP=0;
int main()
{
Point A(4,5);
cout<<"Point A,"<<A.GetX()<<","<<A.GetY();
A.GetC();
Point B(A);
cout<<"Point B,"<<B.GetX()<<","<<B.GetY();
B.GetC();
}

main中的Point A(4,5); 是采用
Point(int xx=0,int yy=0)进行构造的。
Point B(A); 是采用Point(Point &p);进行构造的。
如果不声明拷贝构造函数的话,类是有默认的构造函数的,但是默认构造函数是无参的,即Point();
Point A(4,5);
Point B(A);
就无法使用了。

为了实现同样的功能,你需要增加Point.SetX( int x );和Point.SetY( int y );
通过
Point A;
A.SetX( 4 );
A.SetY( 5 );

Point B;
B.SetX( A.GetX() );
B.SetY( A.GetY() );
来实现,是不是很麻烦?

同时,拷贝构造函数为类之间复制提供了控制手段。如深拷贝和浅拷贝,如,一个类的构造函数中有通过new进行的堆申请的话,允许在拷贝构造函数中手动实现内存的复制。这样,才能简单的通过Point B(A);或者B=A;(当然,需要重载操作符)来进行赋值了。

作用是接受一个同类型的参数,并用该参数对自身进行初始化。
不写Point B(A);这句话就会报错。因为没有相应的构造函数。

我的错,csu_青苔是对的。

那自定义的Point只有一个附加作用了:countP++;这用来统计有多少类的实例被生成。

不写拷贝构造函数应该编译可以通过 编译器会调用默认的拷贝构造函数