C++构造与析构(11) - 析构函数的行为

参考下面的这个例子:

#include <iostream>
using namespace std;

int i;
 
class A
{
public:
    ~A()
    {
        i=10;
    }
};
 
int foo()
{
    i=3;
    A ob;
    return i;
}
 
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}<

上述程序的输出结果:
 i = 3

为何结果是3,而不是10?
当从一个函数返回时,析构函数属于一个最后才被执行的方法。当i值已经拷贝给函数的返回值(return value)之后,ob的析构函数才会被调用。
因此,在析构函数将i值修改为10之前,foo就已经获取到了i的当前值3,因此输出为i = 3。

如何使得程序可以输出i = 10?

可以使用下面的几种方法:

1.返回引用

#include <iostream>
using namespace std;
 
int i;
 
class A
{
public:
    ~A()
    {
        i = 10;
    }
};
 
int& foo()
{
    i = 3;
    A ob;
    return i;
}
 
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}

2.在块作用域内创建对象

#include <iostream>
using namespace std;
 
int i;
 
class A
{
public:
    ~A()
    {
        i = 10;
    }
};
 
int foo()
{
    i = 3;
    {
        A ob;
    }
    return i;
}
 
int main()
{
    cout << "i = " << foo() << endl;
    return 0;
}

因为对象ob是在块中创建的,则块作用域结束时,会调用对象ob的析构函数,此时i值会被修改为10。最后做为返回值进行返回。

3.创建动态对象,然后删除之

int foo()
{
    i = 3;
    A *ob = new A();
    delete ob;
    return i;
}

4.创建临时对象

int foo()
{
    i = 3;
    A ob = A();
    return i;
}

注意:使用此方法,编译时需要带上--no-elide-constructors选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值