+ -
当前位置:首页 → 问答吧 → 高分求助,类对象间这么直接赋值会有危险吗?

高分求助,类对象间这么直接赋值会有危险吗?

时间: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;
  AAA p3=p2;
}

main()函数中两个地方
  AAA p3=p2;这句话肯定会调用拷贝构造函数,这没问题。
然后是 p2=p1; 这里不会调用拷贝构造函数,请问这么写有危险吗,是不是如果类里面没有指针成员数据,就没问题啊?

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

google"深拷贝,浅拷贝"你就知道什么时候该提供行为良好的拷贝构造函数以及operator=

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

那就看你要在这个拷贝构造函数里面做什么了,你这么传得话,就允许通过拷贝构造函数来改变参数,也就是=号左边的那个对象

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

执行到p2=p1;时没有调用我定义的拷贝构造函数,如果调用,会输出ccc。因为我定义的拷贝构造函数如下
 AAA(AAA &x)
  { cout<<“ccc\n"; }

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

p2 = p1;执行赋值构造函数你最好自己写个赋值构造函数
有指针的话肯定会出问题

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

C/C++ code

#include <iostream>
#include <vector>
using namespace std;
class AAA
{
public:
    AAA()
    {
           cout<<"AAA()" << endl; 
    }

    AAA(int x, int y)
    {
           cout<< "AAA(int,int)bb" << endl; 
    }

    AAA(AAA &x)
    {
       cout<< "AAA(AAA&)" << endl;
    }

    AAA& operator = (const AAA&)
    {
        cout << "AAA::operator=" << endl;
    }

    ~AAA()
    {
       cout<< "~AAA()" << endl;
    }

};

int main()
{
       AAA p1(10, 20);
    AAA p2;
    p2=p1;
    AAA p3=p2;
    return 0;
}


楼主,AAA p3=p2;虽然用的是=操作符,但调用的是拷贝构造函数来初始化。
而p2=p1这个则调用真正的operator=操作符,你没有写不代表编译器不给你自动生成。
构造类的时候,编译器会替该类自动生成4个函数:默认构造函数、析构函数、拷贝构造函数、赋值等于构造函数。你上面没写,编译器给你在内部自动生成了operator=,所以p2=p1回去调用operator=,我上面的测试代码你可以运行看看。

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

会调用operator=
假如浅拷贝 若类成员内有指针变量 会导致某一对象析构后另一对象的指针变量为野指针 即已释放 再次析构会出错
深拷贝无该隐患

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

引用 5 楼 wumuzi520 的回复:
C/C++ code

#include <iostream>
#include <vector>
using namespace std;
class AAA
{
public:
AAA()
{
cout<<"AAA()" << endl;
}

AAA(int x, int y)
{
……

补充,拷贝构造函数参数应该是const AAA&,(规范写法)

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