Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1707519
  • 博文数量: 607
  • 博客积分: 10031
  • 博客等级: 上将
  • 技术积分: 6633
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-30 17:41
文章分类

全部博文(607)

文章存档

2011年(2)

2010年(15)

2009年(58)

2008年(172)

2007年(211)

2006年(149)

我的朋友

分类: C/C++

2007-03-07 15:15:07

几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。

构造函数控制对象生成时的基本操作,并保证对象被初始化;

析构函数摧毁一个对象并保证它被彻底清除;

赋值操作符则改变对象的值。


条款11: 为需要动态分配内存的类声明自己版本的拷贝构造函数和赋值操作符

否则,使用赋值操作符时,C++编译器会调用缺省的赋值操作符函数,这可能回导致问题:内存泄露,野指针等.

举个例子

// 一个很简单的string类
class string {
public:
  string(const char *value);
  ~string();

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

private:
  char *data;
};

string a("hello");                 // 定义并构造 a

{                                  // 开一个新的生存空间
  string b("world");               // 定义并构造 b

  ...

  b = a;                           // 执行 operator=,
                                   // b原来的内存丢失了

}                                  // 离开生存空间, 调用b的析构函数,a原来的内存也被释放                               

string c = a;                      // c.data 的值不能确定! 因a.data已被删除                                  

在使用拷贝构造函数时,C++编译器同样也会调用缺省的赋值操作符函数,尽管不会导致内存泄露,但其他问题同样存在.

官方关于拷贝构造函数和赋值运算符的规则
缺省拷贝构造函数(赋值运算符)对类的非静态数据成员进行 "以成员为单位的" 逐一拷贝构造(赋值)。即,如果m是类C中类型为T的非静态数据成员,并且C没有声明拷贝构造函数(赋值运算符),m将会通过类型T的拷贝构造函数(赋值运算符)被拷贝构造(赋值)---- 如果T有拷贝构造函数(赋值运算符)的话。如果没有,规则递归应用到m的数据成员,直至找到一个拷贝构造函数(赋值运算符)或固定类型(例如,int,double,指针,等)为止。默认情况下,固定类型的对象拷贝构造(赋值)时是从源对象到目标对象的 "逐位" 拷贝

阅读(824) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~