临时对象的来源

来源:互联网 发布:故宫纪录片知乎 编辑:程序博客网 时间:2024/04/30 03:59

例1

[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Base  
  5. {  
  6.       public:  
  7.              int a;  
  8.              int b;  
  9.              Base(){cout<<"base"<<endl;}  
  10.              Base(Base &b){cout<<"base(&)"<<endl;}  
  11.              ~Base(){cout<<"~base"<<endl;}  
  12.              void mf(){cout<<"B::fun()"<<endl;}  
  13. };  
  14.   
  15. class Derived:public Base  
  16. {  
  17.     public:  
  18.            int c;  
  19.            Derived(){cout<<"Derived"<<endl;}  
  20.            Derived(Derived &d){cout<<"Derived(&)"<<endl;}  
  21.            ~Derived(){cout<<"~Derived"<<endl;}  
  22.            void mf(){cout<<"D::fun()"<<endl;}  
  23. };  
  24.   
  25. void func(Base& d)//切割,只引用了D类中B的部分。   
  26. {     
  27.    cout<<sizeof(d)<<endl;  
  28.    d.mf();  
  29.    cout<<"func"<<endl;  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     Derived d;  
  35.     func(d);  
  36.     getchar();  
  37.     return 0;  
  38. }  
结果:


例2:

[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Base  
  5. {  
  6.       public:  
  7.              int a;  
  8.              int b;  
  9.              Base(){cout<<"base"<<endl;}  
  10.              Base(Base &b){cout<<"base(&)"<<endl;}  
  11.              ~Base(){cout<<"~base"<<endl;}  
  12.              void mf(){cout<<"B::fun()"<<endl;}  
  13. };  
  14.   
  15. class Derived:public Base  
  16. {  
  17.     public:  
  18.            int c;  
  19.            Derived(){cout<<"Derived"<<endl;}  
  20.            Derived(Derived &d){cout<<"Derived(&)"<<endl;}  
  21.            ~Derived(){cout<<"~Derived"<<endl;}  
  22.            void mf(){cout<<"D::fun()"<<endl;}  
  23. };  
  24.   
  25. void func(Derived& d)   
  26. {     
  27.    cout<<sizeof(d)<<endl;  
  28.    d.mf();  
  29.    cout<<"func"<<endl;  
  30. }  
  31.   
  32. int main()  
  33. {  
  34.     Derived d;  
  35.     func(d);  
  36.     getchar();  
  37.     return 0;  
  38. }  

结果:‘


例3:reference-to-const 参数,产生临时变量

[cpp] view plaincopyprint?
  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. class Base  
  5. {  
  6.       public:  
  7.              int a;  
  8.              int b;  
  9.              Base(int x){cout<<"base"<<endl;}  
  10.              Base(Base &b){cout<<"base(&)"<<endl;}  
  11.              ~Base(){cout<<"~base"<<endl;}  
  12.              void mf(){cout<<"B::fun()"<<endl;}  
  13. };  
  14.   
  15. void func(const Base& b) //func(Base& b)则编译不通过   
  16. {     
  17.    cout<<sizeof(b)<<endl;  
  18.   // b.mf();//编译不通过,b是隐式转换的临时变量时,不能调用Base的成员函数。   
  19.    cout<<"func"<<endl;  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     int x=9;  
  25.     func(1);//隐式转换。Int->Base.  
  26.     getchar();  
  27.     return 0;  
  28. }  
只有当对象以by value方式传递,或是当对象被传递给一个reference to const参数时,这些转换才会发生。如果对象被传递给一个reference to no-const 参数,并不会发生此类转换。所以上例中func(Base& b)则编译不通过 。

1.任何时候只要看到一个reference-to-const参数,就极可能会产生一个临时对象,绑定至该参数上。

2.任何时候只要你看到一个函数返回一个对象,就会产生临时对象(并于稍后销毁)。

原创粉丝点击