| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1238 人关注过本帖
标题:c++析构函数和构造函数调用顺序的问题?
只看楼主 加入收藏
slfzzhm
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-7-16
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:6 
c++析构函数和构造函数调用顺序的问题?
#include<iostream>
using namespace std;

class TDate
{
 int year,month,day;
public:
 TDate(int y=2007,int m=1,int d=1);
 TDate(const TDate &date);
 ~TDate();
 void Print();
};

TDate::TDate(int y,int m,int d)
{
 year = y;
 month = m;
 day = d;
 cout<<"Constructor called.\n";
}

TDate::TDate(const TDate &date)
{
 year = date.year;
 month = date.month;
 day = date.day;
 cout<<"Copy Constructor called.\n";
}

void TDate::Print()
{
 cout<<year<<"_"<<month<<"_"<<day<<endl;
}

TDate::~TDate()
{
 cout<<"Destructor called.\n";
}


TDate f(TDate Q)
{
 TDate R(Q);
 return Q;
}

void main()
{
 TDate day1(1998,5,26);
 TDate day3;
 TDate day2(day1);
 TDate day4 = day2;
 day3 = day2;
 day3 = f(day2);
 day3.Print();
}
输出如下:
Constructor called.        // 1
Constructor called.        // 2
Copy Constructor called.   //3
Copy Constructor called.   //4
Copy Constructor called.   //5
Copy Constructor called.   //6
Copy Constructor called.   //7
Destructor called.       //8
Destructor called.        //9      
Destructor called.        //10
1998-5-26                //11
Destructor called.       //12
Destructor called.        //13
Destructor called.        //14
Destructor called.         //15
1-15都是由哪些函数调用的?能帮我都列出来吗?我初学者不太懂额
搜索更多相关主题的帖子: 函数 顺序 构造 
2010-10-16 17:19
m21wo
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:4
帖 子:440
专家分:1905
注 册:2010-9-23
收藏
得分:0 
把握“先构造后析构,后构造先析构!”就可以了!

If You Want Something, Go Get It, Period.
2010-10-16 20:53
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗯,抓住这个原理,自己分析结果。
要想研究问题,最好的方法就是自己动手设计试验,然后分析结果。
2010-10-16 21:46
yangang2
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:64
专家分:432
注 册:2010-9-1
收藏
得分:20 
/*输出如下:
Constructor called.        // 1TDate day1(1998,5,26);
Constructor called.        // 2TDate day3;
Copy Constructor called.   //3TDate day2(day1);
Copy Constructor called.   //4TDate day4 = day2;
Copy Constructor called.   //5为函数f的参数Q构造
Copy Constructor called.   //6构造R
Copy Constructor called.   //7函数f按值返回构造无名对象
Destructor called.       //8 析构R
Destructor called.        //9 析构f按值返回构造的无名对象   
Destructor called.        //10析构参数Q
1998-5-26                //11day3.Print();
Destructor called.       //12析构day4
Destructor called.        //13析构day2
Destructor called.        //14析构day3
Destructor called.        //15析构day1*/


你可能会奇怪day3 = day2;为什么没有构造,其实在第二句Constructor called.        // 2TDate day3;day3已经构造了,day3=day2;语句不会在次构造它只会掉用默认的重载operator=函数进行值的转换,你要清楚构造函数和复制构造函数都要构造一个对象,operator=只是赋值不构造对象,不管是用复制构造函数还是构造函数构造的对象都要用同一个析构函数去析构。为了验证到底是先析构R还是先析构函数f按值返回构造的无名对象,可以改为下面的代码:
#include<iostream>
using namespace std;

class TDate
{
int year,month,day;
public:
TDate(int y=2007,int m=1,int d=1);
TDate(const TDate &date);
operator =(const TDate &date);
~TDate();
void Print();
};

TDate::TDate(int y,int m,int d)
{
year = y;
month = m;
day = d;
cout<<"Constructor called.\n";
}

TDate::TDate(const TDate &date)
{
year = date.year;
month = date.month;
day = date.day;
cout<<"Copy Constructor called.\n";
}

void TDate::Print()
{
cout<<year<<"_"<<month<<"_"<<day<<endl;
}

TDate::~TDate()
{
    if(year==1997) cout<<"R Destructor called.\n";
    else cout<<"Destructor called.\n";
}
TDate::operator=(const TDate &date)
{
    year = date.year;
    month = date.month;
    day = date.day;
    cout<<"operator=函数在执行.\n";


}


TDate f(TDate Q)
{
TDate R(1997,5,26);
return Q;
}

void main()
{
TDate day1(1998,5,26);
TDate day3;
TDate day2(day1);
TDate day4 = day2;
day3 = day2;
day3 = f(day2);
day3.Print();
}
可以得到证明:
/*Constructor called.        // 1TDate day1(1998,5,26);
Constructor called.        // 2TDate day3;
Copy Constructor called.   //3TDate day2(day1);
Copy Constructor called.   //4TDate day4 = day2;
operator=函数在执行        //day3 = day2;
Copy Constructor called.   //5为函数f的参数Q构造
Copy Constructor called.   //6构造R
Copy Constructor called.   //7函数f按值返回构造无名对象
R Destructor called.       //8 析构R
Destructor called.        //9 析构f按值返回构造的无名对象
operator=函数在执行        //day3 = f(day2);
Destructor called.        //10析构参数Q
1998-5-26                //11day3.Print();
Destructor called.       //12析构day4
Destructor called.        //13析构day2
Destructor called.        //14析构day3
Destructor called.        //15析构day1*/
这时你应该完全了解了吧,同时还对operator=函数有了一定的认识
2010-10-17 13:04
slfzzhm
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-7-16
收藏
得分:0 
回复 4楼 yangang2
说的很详细啊,太谢谢你了啊
2010-10-17 14:53
BNV
Rank: 1
等 级:新手上路
帖 子:23
专家分:4
注 册:2010-10-14
收藏
得分:0 
小白来学习
2010-10-17 15:21
jerry008008
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-10-16
收藏
得分:0 
看看
2010-10-17 18:21
快速回复:c++析构函数和构造函数调用顺序的问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027147 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved