+ -
当前位置:首页 → 问答吧 → c++类会自动生成拷贝构造函数(operator=),是不是就意味着我们没有必要重写这个函数了???

c++类会自动生成拷贝构造函数(operator=),是不是就意味着我们没有必要重写这个函数了???

时间:2011-12-16

来源:互联网

c++类会自动生成拷贝构造函数(operator=),是不是就意味着我们没有必要重写这个函数了???
我感到很疑惑...........

作者: daoluanxiaozi   发布时间: 2011-12-16

当然不是啊
有传说中的深拷贝和浅拷贝

作者: peng_weida   发布时间: 2011-12-16

operator=不是拷贝构造函数啊!
拷贝构造函数只有在用一个对象来初始化定义一个新对象才会调用
假设对象成员有指针 会引起多次delete而导致程序崩溃

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

1. operator = 不叫拷贝构造函数,而是叫拷贝赋值操作符。
2. 缺省的拷贝赋值操作符是浅拷贝。如果你的代码用浅拷贝就能解决,那就不用自己实现,否则就需要。

作者: pathuang68   发布时间: 2011-12-16

引用 2 楼 sryan 的回复:

operator=不是拷贝构造函数啊!
拷贝构造函数只有在用一个对象来初始化定义一个新对象才会调用
假设对象成员有指针 会引起多次delete而导致程序崩溃

我表示很惭愧,应该叫拷贝赋值操作符重载...
那问题就变为“c++类会自动生成拷贝赋值操作符重载(operator=),是不是就意味着我们没有必要重写这个函数了???”

作者: daoluanxiaozi   发布时间: 2011-12-16

引用 3 楼 pathuang68 的回复:

1. operator = 不叫拷贝构造函数,而是叫拷贝赋值操作符。
2. 缺省的拷贝赋值操作符是浅拷贝。如果你的代码用浅拷贝就能解决,那就不用自己实现,否则就需要。

我表示很惭愧,应该叫拷贝赋值操作符重载...
那问题就变为“c++类会自动生成拷贝赋值操作符重载(operator=),是不是就意味着我们没有必要重写这个函数了???”

作者: daoluanxiaozi   发布时间: 2011-12-16

默认的operator = 是浅拷贝,简单的对对象成员的赋值,如果你的成员中有指针的话,很有可能不是你想要的结果

作者: AnDay_Fly   发布时间: 2011-12-16

引用 4 楼 daoluanxiaozi 的回复:

引用 2 楼 sryan 的回复:

operator=不是拷贝构造函数啊!
拷贝构造函数只有在用一个对象来初始化定义一个新对象才会调用
假设对象成员有指针 会引起多次delete而导致程序崩溃

我表示很惭愧,应该叫拷贝赋值操作符重载...
那问题就变为“c++类会自动生成拷贝赋值操作符重载(operator=),是不是就意味着我们没有必要重写这个函数了???”


no 
假设a类有个int *成员,有实例instA和instB,instA=instB,instA的int*由于默认operator=的关系也指向了instB,当A析构的时候instB中的指针指向已经被释放了,然后B再析构就会出错

google 深拷贝 浅拷贝

或者好好看书 书上有的

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

引用 7 楼 sryan 的回复:

引用 4 楼 daoluanxiaozi 的回复:

引用 2 楼 sryan 的回复:

operator=不是拷贝构造函数啊!
拷贝构造函数只有在用一个对象来初始化定义一个新对象才会调用
假设对象成员有指针 会引起多次delete而导致程序崩溃

我表示很惭愧,应该叫拷贝赋值操作符重载...
那问题就变为“c++类会自动生成拷贝赋值操作符重载(operator=),是不是就……

对深拷贝和浅拷贝了解了,就是不知道缺省的赋值操作符重载的是简单的赋值而已...

作者: daoluanxiaozi   发布时间: 2011-12-16

C/C++ code
#include <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};

int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
} 



作者: cxxer   发布时间: 2011-12-16