为什么析构函数不修改返回的变量
Why does the destructor not modify a variable being returned
下面的代码使用了一个修改i
的析构函数。当析构函数运行时,2
应该存储在i
中,但当thing()
返回时,我们观察到-1
。
#include <stdio.h>
class Destruct {
int &i;
public:
Destruct(int &_i) : i(_i) {}
~Destruct() {
i = 2;
}
};
int thing() {
int i = -1;
Destruct d(i);
return i;
}
int main() {
printf("i: %dn", thing());
}
int thing() {
int i = -1;
Destruct d(i);
return i;
}
当函数返回时,对象d
将被销毁,堆栈清理开始!在调用析构函数时,返回的值已经复制到返回寄存器中。
你想看到的,可以通过这样做来看到:
int thing() {
int i = -1;
{
Destruct d(i); //put it inside braces!
}
return i;
}
根据您的评论:
这就是它的工作原理,代码的反汇编表明情况就是这样。我很好奇为什么。
逻辑很简单,可以这样证明:假设在i
复制到返回寄存器之前调用了析构函数,那么为什么要选择性地销毁d
而不销毁i
呢?毕竟两者都是局部变量。因此,如果d
被破坏,那么i
也应该被破坏,在之前,它的值被复制到返回寄存器,但这没有意义
正如@Luc Touraille(在评论中)所问:"如果你的函数返回d
怎么办?你确定你希望d
在传递给调用者之前被销毁吗?"
因为析构函数是在复制语句return i
中的i之后执行的。
如果你通过将i
设置为全局并通过引用返回来更改你的程序,你会看到你想要的。
#include <stdio.h>
int i = -1;
class Destruct {
int &i;
public:
Destruct(int &_i) : i(_i) {}
~Destruct() {
i = 2;
}
};
int& thing() {
Destruct d(i);
return i;
}
int main() {
printf("i: %dn", thing());
}
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 从私有成员变量的成员方法返回unique_ptr
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- C++ 根据给定的类型名从变量返回数据
- 为什么 std::isnan() 对于具有 NAN 值的双变量返回 false
- C++ 在静态函数中使用非静态变量返回类实例
- 具有变量返回类型的函数
- 带有 QVariant 和模板的变量返回类型
- getenv() 在不同的程序中为同一环境变量返回不同的值
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 变量返回类型
- C++函数向字符串变量返回int
- 从临时变量返回的引用是否有效
- 有没有一种方法可以将C++数据类型作为变量返回
- 类函数的模板变量返回类型
- C++函数,使用'auto'变量返回类型
- 如何将引用变量返回到函数中
- 变量返回类型上转换覆盖c++
- 数组变量返回意外值