+ -
当前位置:首页 → 问答吧 → 这句话到底做了什么,

这句话到底做了什么,

时间:2011-12-04

来源:互联网

#include <iostream.h>
class AAA
{ public:
  AAA()
  { cout<<“aaa\n"; }
  AAA(int x, int y)
  { cout<<“bbb\n"; }
  AAA(AAA &x)
  { cout<<“ccc\n"; }
  ~AAA()
  { cout<<“ddd\n"; }
};

void main()
{ AAA p1(10, 20);
  AAA p2;
  p2=p1;
 }

p2=p1;这句话执行,调用拷贝构造函数了吗?但是执行到这里没有输出ccc,也就是没有调用我写的拷贝构造函数
 AAA(AAA &x)
  { cout<<“ccc\n"; }

那么这句话到底做了什么?这么写有危险吗?

作者: tjucruiser   发布时间: 2011-12-04

AAA(AAA &x)
AAA(const AAA &x) //这个才是拷贝构造函数

作者: yisikaipu   发布时间: 2011-12-04

你不写,编译器帮你自己合成一个operator = (const ..)

作者: qscool1987   发布时间: 2011-12-04

你写的那几个都不是拷贝函数

作者: bdmh   发布时间: 2011-12-04

而且p2=p1;是赋值
C/C++ code
AAA& operator=(AAA &x)
  {
      cout <<"assign" <<endl;
      return x;
  }


AAA p2=p1;这才是调用拷贝构造来初始化

注意差别
p2=p1;
AAA p2=p1;

作者: yisikaipu   发布时间: 2011-12-04

当用一个对象初始化另一个对象的时候 会调用拷贝构造函数
记住是初始化

A a;
==========================
A b(a);
A c=b;
A *d=new A(c);
上述都会调用拷贝构造函数

再执行 b=c;
会运行操作符= 若未提供编译器默认提供一个值复制的A& operator=(const A& other);

作者: sryan   发布时间: 2011-12-04

引用 1 楼 yisikaipu 的回复:AAA(AAA &amp;x)
AAA(const AAA &amp;x) //这个才是拷贝构造函数


更正,这里不是这个问题,请无视#1楼

作者: yisikaipu   发布时间: 2011-12-04

p2 = p1应该调用的是赋值构造函数,你最好自己写个赋值构造函数,有指针的话肯定会出问题

作者: qwer_boo   发布时间: 2011-12-04

引用 4 楼 yisikaipu 的回复:

而且p2=p1;是赋值
C/C++ code
AAA&amp; operator=(AAA &amp;x)
{
cout <<"assign" <<endl;
return x;
}


AAA p2=p1;这才是调用拷贝构造来初始化

注意差别
p2=p1;
AAA p2=p1;


++

作者: yuegeman   发布时间: 2011-12-04

赋值操作符没有定义,编译器就自己生成一个默认的构造函数,进行浅拷贝。

作者: riyueming184   发布时间: 2011-12-04

没有,调用的是编译器默认生成的重载的赋值操作符

作者: zzcmx2008   发布时间: 2011-12-04

说错了,是:赋值操作符没有定义,编译器就自己生成一个默认的赋值操作符,进行浅拷贝。

作者: riyueming184   发布时间: 2011-12-04