刚学C++,问一下拷贝构造函数

Point::Point(int xx=0,int yy=0){
x=xx;y=yy;
}
Point::Point(Point& p){
x=p.x-1;
y=p.y-1;
}
Point p(1,1);
Point p2 = p;
Point p3;
p3 = p;
point下就int x,y,我主要是对p2,p3的值不理解
这里p3是已经建立的对象,所以p3=p的时候不调用拷贝构造函数,那这是纯粹的复制?这种复制是如何实现的?(把所有成员都复制了?不就像默认的拷贝构造函数)

//如果你在Point类中没有定义=操作符,则系统使用默认的=操作符,
//就是把成员变量复制到对应的成员变量中,
//如果你自己想定义赋值运算符(=)则需要自己实现,
//自己定义(或者叫重载)赋值运算符号,通常是在你定义
//的类里面有资源分配时这样做,如下:
//(建议你看看赋值运算符的重载)
class Point
{
public:
Point()
{
x = 0;
y=0;
pData = NULL;
}
~Point()
{
delete pData;
pData = NULL;
}
Point(int xx,int yy);
Point(Point& p);
Point & operator = (Point &NewValue)//自己写赋值操作(重载Point类的=操作符)
{
this->x = NewValue.x;
this->y = NewValue.y;
this->pData = new int;
*pData = *(NewValue.pData);//如果不自己重载赋值操作,则只会对指针浅拷贝,即,
//新生成的类中此指针没有分配空间,而是指向了别个类已有的空间
return *this;
}
private:
int x;
int y;
int *pData;//类内部有通过指针分配的空间
};

Point::Point(int xx,int yy){
x=xx;
y=yy;
pData = new int;
*pData = x + y;
}
Point::Point(Point& p){
x=p.x-1;
y=p.y-1;
pData = new int;
*pData = *(p.pData);
}

int _tmain(int argc, _TCHAR* argv[])
{
Point p(1,1);
Point p2 = p; //此处才调用拷贝构造(此处是构造并初始化)
Point p3;
p3 = p; //此处是赋值运算,不是构造

getchar();
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-30
定义一个空的C++类,例如

class Empty
{
}

一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于

class Empty
{
public:
Empty(); // 缺省构造函数
Empty( const Empty& ); // 拷贝构造函数
~Empty(); // 析构函数
Empty& operator=( const Empty& ); // 赋值运算符
Empty* operator&(); // 取址运算符
const Empty* operator&() const; // 取址运算符 const
};

一般的书上好像都是前面四种:默认构造函数,拷贝构造函数,默认赋值函数以及析构函数,后面两种其实属于,但要需要注意的是,只有当你需要用到这些函数的时候,编译器才会去定义它们。

所以p3=p调用的是默认赋值构造函数

参考资料:http://zhidao.baidu.com/question/114327493.html?si=1

第2个回答  2009-12-30
Point p2 = p; // 相当于 Point p2(p);

Point p3;// 如果你已经定义了构造函数,编译器不会生成Point(){}默认构造函数的。就是说,你这句是错的,不会通过的。

Point &p3 = p;//这样引用是可以的
第3个回答  2009-12-30
Point p2 = p; //由于p2未创建,相当于Point p2(p);
调用复制构造函数
Point(Point& p){
x=p.x-1;
y=p.y-1;
}
所以p2.x等于0,p2.y等于0
Point p3;//没用指针构造函数,调用默认的无参数构造函数,即p3.x等于0
p3.y等于0
p3 = p; //这句相当于调用默认的operator=函数,即
Point& operator=(Point const &p)
{
this->x = p.x;
this->y = p.y;
return *this;
}
相当于把所有成员变量都进行值复制(浅复制)
当成员涉及指针时,应采用深复制
相似回答