初始化 赋值 拷贝
来源:互联网 发布:数据库建模工具有哪些 编辑:程序博客网 时间:2024/06/05 08:00
折腾我挺长一段时间,基本挺明白了,先来个区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。 下面看例子。
c++中初始化和赋值操作差别是很大的。
对于基本数据类型差别不大:
比如:
int a = 12; // initialization, copy 0X000C to a a = 12; // assignment, copy 0X000C to a
但是对用户自定义的数据类型比如String 初始化和赋值就差别很大:
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_; s_ = tmp; // 多一个赋值操作!现在是指向字符的指针,如果是个大对象,效率的差别可想而知. return *this; }
建议在条件允许的情况下最好在初始化的时候就赋值,而尽量避免用=号赋值了,比如用成员初始化列表来初始化成员数据,不在构造函数里用赋值操作给成员数据.
复制构造函数与赋值操作符之间的区别
复制构造函数又称拷贝构造函数,它与赋值操作符间的区别体现在以下几个方面
1.从概念上区分:
复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数
2.从原型上来区分:
复制构造函数原型 ClassType(const ClassType &); 无返回值
赋值操作符原型 ClassType& operator=(const ClassType &); 返回值为 ClassType 的引用,便于连续赋值操作
3.从使用的场合来区分:
复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时、函数返回值为类类型时以及初始化语句,例如(示例了初始化语句,函数参数与函数返回值为类的值类型时较简单,这里没给出示例)
ClassType a; //ClassType b(a); //调用复制构造函数ClassType c = a; //调用复制构造函数
而赋值操作符要求‘=’的左右对象均已存在,它的作用就是把‘=’右边的对象的值赋给左边的对象
ClassType e;Class Type f;f = e; //调用赋值操作符
4.当类中含有指针成员时,两者的意义有很大区别
复制构造函数需为指针变量分配内存空间,并将实参的值拷贝到其中;而赋值操作符它实现的功能仅仅是将‘=’号右边的值拷贝至左值,在左边对象内存不足时,先释放然后再申请。当然赋值操作符必须检测是否是自身赋值,若是则直接返回当前对象的引用而不进行赋值操作
- 初始化 赋值 拷贝
- 赋值和初始化不同以及安全拷贝
- C++ 拷贝、复制、赋值 、初始化的理解
- 初始化,赋值
- 赋值&初始化
- C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
- Effective C++ 第二版 11) 拷贝和赋值 12) 使用初始化
- 拷贝,赋值构造函数赋值
- 拷贝构造和拷贝赋值
- 拷贝构造与拷贝赋值
- 拷贝赋值实现
- 构造、拷贝构造、赋值
- 拷贝,赋值与销毁
- 拷贝构造 赋值构造
- 拷贝、赋值和销毁
- python赋值/拷贝问题
- 构造&转换&拷贝&赋值
- 拷贝构造和赋值重载,移动拷贝,赋值拷贝
- Eclipse中切换SVN账号
- 【AJAX探索之路系列】之一:AJAX开篇
- struts2--中
- 对于Java中多线程互斥锁初步了解
- 关于重定向和转发的理解
- 初始化 赋值 拷贝
- UBUNTU配置mail发送邮件
- 树分治经典题+树状数组(hdu4918)
- WCF:如何将net.tcp协议寄宿到IIS
- 求完数
- OpenCV stereo matching BM 算法
- 欢迎使用CSDN-markdown编辑器
- 【重构】ER图生成数据库文档
- 安卓非自定义标题栏实现“返回”按钮