拷贝构造函数应用场景
2015-09-04 15:10
417 查看
拷贝构造函数应用场景有四种
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Vertify { public: Vertify() { cout << "无参构造函数 " << "构造的对象地址是:" << this << endl; } Vertify(int size) { cout << "有参构造函数 " << "构造的对象地址是:" << this << endl; this->size_ = size; } Vertify(const Vertify & obj) { cout << "拷贝构造函数 " <<"构造的对象地址是:" << this<<endl; this->size_ = obj.size_; } void operator= (Vertify & obj) { this->size_ = obj.size_; cout << "=运算符重载 " << "被赋值的对象地址是:" << this << endl; } ~Vertify() { cout << "析构函数 " <<"释放的对象地址是:"<<this<< endl; size_ = 0; } public: int size_; }; void Test(Vertify ver)//调用形参的拷贝构造函数 { cout << ver.size_ << endl; } Vertify Fun() { //C++编译器会生成一个匿名对象,匿名对象=v(调用拷贝构造函数),并将其返回出去 Vertify v(10);//调用一次有参构造函数 return v;//调用一次拷贝构造函数,匿名对象=v,调用一次析构函数,释放v的内存 } //场景1 void Situation1() { Vertify v1(11); Vertify v2 = v1;//定义并初始化,调用拷贝构造函数 } //场景2 void Situation2() { Vertify v1(22); Vertify v2(v1);//定义并初始化 ,调用拷贝构造函数 } //场景3 void Situation3() { Vertify v1(33); Test(v1); } //场景4 void Situation4() { Vertify v(44);//调用一次构造函数 v = Fun();//调用=运算符重载函数 }//调用两次析构函数,先释放的是Fun返回的匿名对象,再释放v的内存空间 //对场景4的优化 void Situation5() { Vertify v = Fun(); cout << "这里没有调用拷贝构造函数,而是直接将匿名对象提升为v对象----现代c++编译器进行的优化,提高了性能" << endl; } int main() { Situation1(); Situation2(); Situation3(); Situation4(); Situation5(); cin.get(); return 0; }
注:观看对象地址了解对象的构造及析构顺序
//场景1打印结果如下
//场景2打印结果如下
//场景3打印结果如下
//场景4打印结果如下
//场景5打印结果如下
总结:场景4与5区别本质是编译器对匿名对象的处理:
1.=操作时,调用类的=运算符重载函数。
2.初始化操作时,编译器会做优化,不再调用类的拷贝构造函数,大大提高效率。
相关文章推荐
- 项目如何脱离TFS 2010的管理
- 18.策略模式
- PHP循环遍历倒金字塔
- Algorithms - Week 1-1 Analysis of Algorithms
- HDU 5240 Exam (好水的题)
- 数据结构必须掌握 栈---压栈和出栈
- 百分比布局支持库 RelativeLayout和FrameLayout的尺寸用%来表示
- Ajax、json
- 自定义按钮~自适应布局~常见bug
- 使用Spark SQL 探索“全国失信人数据”
- iOS 文本与图片表情混排的实现
- SharePoint 2013 IT Professional —— Permissions
- Java Web 国际化
- HDU——2104 hide handkerchief
- 详解Oracle DELETE和TRUNCATE 的区别(摘)
- 关于Java中基于名字重用的几种形式的区别(覆写、隐藏、重载、遮蔽、遮掩)
- 多对多的关系操作
- 第三方后台管理
- RVO和NRVO
- 实施 ORM 的两项要旨:泛型和反射