注册 登录
编程论坛 C++教室

析构函数的调用

wuyushuai521 发布于 2012-11-22 20:40, 332 次点击
各位大侠,小弟编写了一个关于析构函数调用的程序:其中有些不明白之处,望各位大侠指点一二:
#include <iostream>

using namespace std;

class date
{
private:
    int year;
    int month;
    int day;
public:
    date(int y=2009,int m=1,int d=1);
    date(const date& de);
    ~date();
    void showdate();
};

date::date(int y,int m,int d)
{
    year=y;
    month=m;
    day=d;
    cout<<"Constructing..."<<endl;
}

date::date(const date &de)
{
    year=de.year;
    month=de.month;
    day=de.day;
    cout<<"Copy constructing..."<<endl;
}

date::~date()
{
    cout<<"destructing.."<<endl;
}

void date::showdate()
{
    cout<<year<<"."<<month<<"."<<day<<endl;
}
date fun(date de1)
{
    date date3(de1);
    return date3;
}

int main()
{
    date obj1(1993,3,20);
    date obj3;
    date obj2(obj1);
    date obj4=obj2;
    obj3=obj2;
    obj3=fun(obj2);
    obj3.showdate();
   
    return 0;
}

输出结果为:
只有本站会员才能查看附件,请 登录
小弟不明白的是:画红线的部分,在那个地方析构函数怎么会被调用,而且还被调用了三次?
3 回复
#2
liufashuai2012-11-22 22:10
不要这样看,你要知道,要创建一个对象,可以用构造函数,也可以拷贝构造函数,但是销毁一个对象,却要调用析构函数,因此,
你最后应该查看,构造函数,拷贝构造函数之和的数量是否和析构函数的数量相等

拷贝构造函数在3个地方调用,1,被当作参数传递 2,被当作返回值,3,初始化对象

所以你自己对照着看吧,应该很容易理解
#3
mmmmmmmmmmmm2012-11-22 22:39
调试发现:楼主所说的三次析构是在这段代码里面obj3=fun(obj2);执行的。

程序代码:
先分析构造函数:
fun(obj2)//形参执行一次Copy constructing...
date date3(de1);//定义data3 执行一次Copy constructing...
return date3;//函数返回data对象 执行一次Copy constructing...
与之相对应,就会有三次destructing..


个人观点,还请各位指教。
#4
wuyushuai5212012-11-27 16:34
谢谢
1