Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193230
  • 博文数量: 42
  • 博客积分: 935
  • 博客等级: 准尉
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 16:57
个人简介

.

文章分类

全部博文(42)

文章存档

2013年(2)

2012年(5)

2011年(35)

我的朋友

分类: C/C++

2011-02-14 09:57:30

先看下面的例子:
  1. /* 先定义变量,然后给变量赋值 */
  2. // 定义变量j,未进行初始化,即在内存中分配一个空间并将地址赋给j,&j可以取变量j的地址,
  3. int j; // 这时变量j所指向的对象为一个随机值
  4. // 给变量j赋值为10,给变量赋值,即使变量地址指向指定的对象。
  5. j = 10;

  6. /* 定义变量的同时,进行初始化 */
  7. int i = 10;
那初始化和赋值到底有什么区别呢?
赋值操作是在两个已经存在的对象间进行的,而初始化是创建一个新的对象,并且初始值来源于另一个已经存在的对象。
编译器会区分这两种情况。
初始化,编译器在编译时,调用拷贝构造函数,就对变量值进行了定义。
赋值,则调用重载的赋值运算符。如类没有提供拷贝构造函数,编译器会提供一个默认的。这个默认的拷贝构造函数只是简单的复制类的每个成员。
对于基本数据类型,差别不大:
  1. int i = 10; // 初始化,定义变量i,并将10在内存中的地址copy给变量i

  2. i = 10; // 赋值,将10在内存中的地址copy给变量i
对于用户自定义的数据类型,搜集网上的的一个例子,如下:
  1. class String {
  2. public:
  3. String( const char *init ); // intentionally not explicit!

  4. ~String();
  5. String( const String &that );
  6. String &operator =( const String &that );
  7. String &operator =( const char *str );
  8. void swap( String &that );
  9. friend const String // concatenate

  10. operator +( const String &, const String & );
  11. friend bool operator <( const String &, const String & );
  12. //...

  13. private:
  14. String( const char *, const char * ); // computational

  15. char *s_;
  16. };
初始化的构造过程比较简单,先分配空间,然后填充数据:
  1. String::String( const char *init ) {
  2. if( !init ) init = "";
  3. s_ = new char[ strlen(init)+1 ];
  4. strcpy( s_, init );
  5. }
析构过程更简单了:
  1. String::~String() { delete [] s_; }
如果是赋值,就复杂多了,如下:
  1. String &String::operator =( const char *str ) {
  2. if( !str ) str = "";
  3. char *tmp = strcpy( new char[ strlen(str)+1 ], str );
  4. delete [] s_;
  5. s_ = tmp;
  6. return *this;
  7. }
 
阅读(3152) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~