条款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:

一个无名对象问题

基础备忘:关于构造函数、拷贝构造函数、析构函数