为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符


为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符
摘自effectiveC++第11条

例如这个类里没有声明赋值操作符和拷贝构造函数,这会带来一些不良后果。

class CFoo
{
public:
  CFoo() {data = new char[10];}
  ~CFoo() {delete [] data;}

  // 没有拷贝构造函数和operator=

private:
  char *data;
};
CFoo a, b;

当b = a时,因为没有自定义的operator=可以调用,c++会生成并调用一个缺省的operator=操作符。这个缺省的赋值操作符会执行成员指针的赋值操作。

第一,b成员指针曾指向的内存永远不会被删除,因而会永远丢失,产生内存泄漏。第二,现在a和b包含的成员指针指向同一个字符串,那么只要其中一个析构时,就会删除掉另一个指针还指向的那块内存。

CFoo c = a时,会调用拷贝构造函数,因为它也没有在类中定义,c++以与处理赋值操作符一样的方式生成一个拷贝构造函数并执行相同的动作:对对象里的指针进行逐位拷贝。这会导致同样的问题,但不用担心内存泄漏,因为被初始化的对象还不能指向任何的内存。不过,假如c被a初始化后,成员指针会指向同一个地方,那这个地方会被删除两次。

对于有些类,可以确信程序中不会做拷贝和赋值操作的时候,可以只声明这些函数(声明为private成员)而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。

你可能感兴趣的:(C++,c,delete,Class,编译器)