您的位置:首页 > 其它

构造函数、拷贝构造函数、赋值函数、析构函数的调用顺序

2011-09-15 20:51 363 查看
例1
#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
class B{
public:
B(){
cout<<"default constructor\n";
}
~B(){
cout<<"destructed\n";
}
B(int i):data(i){
cout<<"constructed by parameter"<<data<<endl;
}
B(B &b){
cout<<"copy constructor\n";
data=b.data;
}
protected:
private:
int data;
};

B play(B b){
return b;
}

int _tmain(int argc, _TCHAR* argv[])
{
B t1=play(5);
B t2=play(t1);
system("pause");
return 0;
}


输出结果:

constructed by parameter 5

copy constructor

destructed

copy constructor

copy constructor

destructed

destructed

destructed

分析:

constructed by parameter 5 调用带参数的构造函数在play内产生临时对象

copy constructor 调用复制构造函数把临时对象复制到t1

destructed play内的临时对象析构

copy constructor 调用复制构造函数在play内产生临时对象

copy constructor 调用复制构造函数把临时对象复制到t2

destructed play内的临时对象析构

destructed t2析构

destructed t1析构

例2

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
class B{
public:
B(){
cout<<"default constructor\n";
}
~B(){
cout<<"destructed\n";
}
B(int i):data(i){
cout<<"constructed by parameter"<<data<<endl;
}
B(B &b){
cout<<"copy constructor\n";
data=b.data;
}
protected:
private:
int data;
};

B play(B b){
return b;
}

int _tmain(int argc, _TCHAR* argv[])
{
B t1=play(5);
B t2=play(10);
system("pause");
return 0;
}


输出结果:

constructed by parameter 5

copy constructor

destructed

constructed by parameter 10

copy constructor

destructed

destructed

destructed

分析:

constructed by parameter 5 调用带参数的构造函数play内产生临时对象

copy constructor 调用复制构造函数把临时对象复制到t1

destructed play内临时对象析构

constructed by parameter 10 调用带参数的构造函数play内产生临时对象

copy constructor 调用复制构造函数把临时对象复制到t2

destructed play内临时对象析构

destructed t2析构

destructed t1析构

例3

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;
class B{
public:
B(){
cout<<"default constructor\n";
}
~B(){
cout<<"destructed\n";
getchar();
}
B(int i){
cout<<"constructed by parameter"<<endl;
}
B(B &b){
cout<<"copy constructor\n";
getchar();
}
B& operator =(const B&b){
cout<<"This is an assigment function\n";
return *this;
}
protected:
private:
};

B play(){
B b;
return b;
}

int _tmain(int argc, _TCHAR* argv[])
{
B b;
b=play();
return 0;
}


输出:

default constructor

default constructor

copy constructor

destructed

This is an assigment function

destructed

destructed

分析:

default constructor main()函数中的对象a通过默认构造函数创建

default constructor play()函数中的对象a通过默认构造函数创建

copy constructor play()返回时生成临时对象是由复制构造函数生成的

destructed play()函数中的a对象析构

This is an assigment function 临时对象赋给a使用赋值函数

destructed 临时对象析构

destructed main()函数中的对象a析构
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐