条款19了解临时对象的来源 练习
来源:互联网 发布:淘宝佣金多少 编辑:程序博客网 时间:2024/05/17 03:35
例1
#include<iostream>using namespace std;class Base{ public: int a; int b; Base(){cout<<"base"<<endl;} Base(Base &b){cout<<"base(&)"<<endl;} ~Base(){cout<<"~base"<<endl;} void mf(){cout<<"B::fun()"<<endl;}};class Derived:public Base{ public: int c; Derived(){cout<<"Derived"<<endl;} Derived(Derived &d){cout<<"Derived(&)"<<endl;} ~Derived(){cout<<"~Derived"<<endl;} void mf(){cout<<"D::fun()"<<endl;}};void func(Base& d)//切割,只引用了D类中B的部分。 { cout<<sizeof(d)<<endl; d.mf(); cout<<"func"<<endl;}int main(){ Derived d; func(d); getchar(); return 0;}结果:
例2:
#include<iostream>using namespace std;class Base{ public: int a; int b; Base(){cout<<"base"<<endl;} Base(Base &b){cout<<"base(&)"<<endl;} ~Base(){cout<<"~base"<<endl;} void mf(){cout<<"B::fun()"<<endl;}};class Derived:public Base{ public: int c; Derived(){cout<<"Derived"<<endl;} Derived(Derived &d){cout<<"Derived(&)"<<endl;} ~Derived(){cout<<"~Derived"<<endl;} void mf(){cout<<"D::fun()"<<endl;}};void func(Derived& d) { cout<<sizeof(d)<<endl; d.mf(); cout<<"func"<<endl;}int main(){ Derived d; func(d); getchar(); return 0;}
结果:‘
例3:reference-to-const 参数,产生临时变量
#include<iostream>using namespace std;class Base{ public: int a; int b; Base(int x){cout<<"base"<<endl;} Base(Base &b){cout<<"base(&)"<<endl;} ~Base(){cout<<"~base"<<endl;} void mf(){cout<<"B::fun()"<<endl;}};void func(const Base& b) //func(Base& b)则编译不通过 { cout<<sizeof(b)<<endl; // b.mf();//编译不通过,b是隐式转换的临时变量时,不能调用Base的成员函数。 cout<<"func"<<endl;}int main(){ int x=9; func(1);//隐式转换。Int->Base. getchar(); return 0;}只有当对象以by value方式传递,或是当对象被传递给一个reference to const参数时,这些转换才会发生。如果对象被传递给一个reference to no-const 参数,并不会发生此类转换。所以上例中func(Base& b)则编译不通过 。
1.任何时候只要看到一个reference-to-const参数,就极可能会产生一个临时对象,绑定至该参数上。
2.任何时候只要你看到一个函数返回一个对象,就会产生临时对象(并于稍后销毁)。
例4:函数返回对象
#include<iostream>using namespace std;class Base{ public: Base(){cout<<"Base"<<endl;} Base(Base& b){cout<<"Base(&)"<<endl;} ~Base(){cout<<"~Base"<<endl;}};Base func(){ return Base();//编译器优化,把对象构造到目标对象上。如同Base tp = Base();}int main(){ func();//相当于const Base temp = func();temp在函数调用语句结束后即析构。 getchar(); return 0;}结果:
例5:函数返回对象
#include<iostream>using namespace std;class Base{ public: Base(){cout<<"Base"<<endl;} Base(Base& b){cout<<"Base(&)"<<endl;} ~Base(){cout<<"~Base"<<endl;}};Base func(Base &b){ return b;}int main(){Base ob; func(ob);//相当于const Base temp = func(ob);temp在函数调用语句结束后即析构。 getchar(); return 0;}结果:
例6:函数返回对象
#include<iostream>using namespace std;class Base{ public: Base(){cout<<"Base"<<endl;} Base(Base& b){cout<<"Base(&)"<<endl;} ~Base(){cout<<"~Base"<<endl;}};Base func(Base b){ return b;}int main(){ Base ob; func(ob);//相当于const Base temp = func(ob);temp在函数调用语句结束后即析构。 getchar(); return 0;}结果:
相关Blog:
一个无名对象问题
基础备忘:关于构造函数、拷贝构造函数、析构函数
- 条款19了解临时对象的来源 练习
- 条款19 了解临时对象的来源
- 条款十九:了解临时对象的来源
- 效率:条款19 了解临时对象的来源
- 19. 了解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 临时对象的来源
- 了解临时对象的来源 (深刻理解为什么不能返回一个临时变量的引用)
- 理解临时对象的来源
- 理解临时对象的来源
- More Effective C++----(19)理解临时对象的来源
- 9.深刻理解临时对象的来源
- c++临时对象的来源即成本
- 理解临时对象的来源(More Effective C++_19(效率))
- More Effective C++ ——019_理解临时对象的来源
- 研磨设计模式之观察者模式 学习笔记
- java 命令行窗口输出希腊字母表
- 解决gentoo无法使用gitk命令
- 基于DirectShow的WinCE多媒体编程
- 根据数据字典表定义的表结构,生成创建表的SQL语句
- 条款19了解临时对象的来源 练习
- 求s=a+aa+aaa+aaaa+aa...a的值(技术支持课任务)
- poj 3083
- Java中使用InputStream读入Jar/zip内容
- 天易12----jquery实现简单的选项卡效果
- ubuntu crontab crond
- 反编译并修改已生成的asp.net 网站
- 【ACM】做题总结
- 算法导论CLRS 9.2 选择第i小的元素