先看下面的例子:
- /* 先定义变量,然后给变量赋值 */
- // 定义变量j,未进行初始化,即在内存中分配一个空间并将地址赋给j,&j可以取变量j的地址,
- int j; // 这时变量j所指向的对象为一个随机值
- // 给变量j赋值为10,给变量赋值,即使变量地址指向指定的对象。
- j = 10;
- /* 定义变量的同时,进行初始化 */
- int i = 10;
那初始化和赋值到底有什么区别呢?
赋值操作是在两个已经存在的对象间进行的,而初始化是创建一个新的对象,并且初始值来源于另一个已经存在的对象。
编译器会区分这两种情况。
初始化,编译器在编译时,调用拷贝构造函数,就对变量值进行了定义。
赋值,则调用重载的赋值运算符。如类没有提供拷贝构造函数,编译器会提供一个默认的。这个默认的拷贝构造函数只是简单的复制类的每个成员。
对于基本数据类型,差别不大:
- int i = 10; // 初始化,定义变量i,并将10在内存中的地址copy给变量i
- i = 10; // 赋值,将10在内存中的地址copy给变量i
对于用户自定义的数据类型,搜集网上的的一个例子,如下:
- class String {
- public:
- String( const char *init ); // intentionally not explicit!
- ~String();
- String( const String &that );
- String &operator =( const String &that );
- String &operator =( const char *str );
- void swap( String &that );
- friend const String // concatenate
- operator +( const String &, const String & );
- friend bool operator <( const String &, const String & );
- //...
- private:
- String( const char *, const char * ); // computational
- char *s_;
- };
初始化的构造过程比较简单,先分配空间,然后填充数据:
- String::String( const char *init ) {
- if( !init ) init = "";
- s_ = new char[ strlen(init)+1 ];
- strcpy( s_, init );
- }
析构过程更简单了:
- String::~String() { delete [] s_; }
如果是赋值,就复杂多了,如下:
- String &String::operator =( const char *str ) {
- if( !str ) str = "";
- char *tmp = strcpy( new char[ strlen(str)+1 ], str );
- delete [] s_;
- s_ = tmp;
- return *this;
- }
阅读(3197) | 评论(0) | 转发(0) |