Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1541191
  • 博文数量: 237
  • 博客积分: 5139
  • 博客等级: 大校
  • 技术积分: 2751
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-18 14:48
文章分类

全部博文(237)

文章存档

2016年(1)

2012年(4)

2011年(120)

2010年(36)

2009年(64)

2008年(12)

分类: C/C++

2010-01-08 13:27:41

一个类会默认生成它的

string()  //默认普通构造函数

void string( const string &a ) //默认拷贝构造函数,如果自己不实现,会用这个默认的

                               //采用“位拷贝”的方式,对有成员指针的情况,一定有

                               //问 题, 因为“位拷贝”, 指向同一地址空间,自己

                               //实现,改成“值拷贝”

~stirng()  //默认析构函数

const string& operation=( const string &a ) //默认赋值函数,如果自己不实现,

                         //默认的也是采用“位拷贝”的方式

“位拷贝”, string a(b);

除了a,b对象的地址不一样, 但a,b成员对象都指向的同一地址空间。 如果delete a, 就会删掉b的内容,所以位拷贝,对有指针成员变量的类,非常危险



拷贝构造函数发生的例子:  
  A   a(1);     //调用构造函数,  
  A   b(a);    //调用拷贝构造函数  
  A   c=a;     //第一次赋值,因为对象还没初始化,还是调用拷贝构造函数,  
  c=b;         //已经初始化的对象才能调用赋值函数   
  void   f(A   a);     //函数声明  
  f(c);        //实参传递时调用拷贝构造函数,但是编译器会根据具体情况把这个过程优化掉

总结:

1.拷贝构造函数只有在定义一个新的类对象并且用已有的对象进行初始化时调用.

2.赋值函数只有在已经初始化(对象已定义)的情况下被调用

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