构造函数、析构函数、拷贝构造函数

来源:互联网 发布:网络技术培训 编辑:程序博客网 时间:2024/05/21 14:05

拷贝构造函数什么时候调用:

1、一个对象以值传递的方式传入函数体

2、一个对象以值传递的方式从函数返回

3、一个对象通过另一个对象进行初始化,注意,不是赋值=




<span style="font-size:18px;">#include <iostream>using namespace std;class B { public: B() { cout<<"默认构造函数"<<endl;} ~B() { cout<<"析构函数"<<n<<endl;} B(int i):data(i) //B(int) works as a converter ( int -> instance of B) { order++;n=order;cout<<"带参数的构造函数" <<n <<endl;} B(B & b){order++;n=order;data=b.data;cout<<"拷贝构造函数"<<n<<endl;}private: int data; static int order;int n;}; int B::order=0;B Play( B b) { return b ; } void main(){B t1=Play(5);cout<<"---------------------------------"<<endl;B t2=Play(t1);cout<<"--------------------------------"<<endl;}</span>





一共产生了4个对象

说明:

B t1=Play(5);

        1.第一个对象是Play(5)产生的,5即B(5)

         2、Play返回一个临时对象,用来初始化一个新对象,编译器优化为 B t1(Play(5));调用拷贝构造函数。

         3、析构B(5);

B t2=Play(t1); 

         1、t1传值,调用拷贝构造函数,传入副本给函数Play

         2、由于返回的对象也是用来构造一个新的对象,这是就不需要再在主程序中生成一个临时对象来接收返回值,再把临时对象的值给t2;而是直接用t2接收Play函数的返回值,即 B t2(Play(t1));  同B t2=Play(5); 

         3、函数结束后,析构t1传入的副本




0 0
原创粉丝点击