c++ - 临时对象在 C++ 中的行为如何?

标签 c++ class object

当我尝试运行下面的代码时,我完全糊涂了..

#include<iostream>
using namespace std;

class test{
    public:
    int num = 30;

    int yourAge ;

    void set(){
        yourAge = (test().num)*2; 
    }
};

int main(){
    test obj;


    cout << test().yourAge << endl; // i was expecting garbage but giving me 0
    cout << obj.yourAge << endl;    // ya! garbage it is, in this case

    ///// now/////

    test().set()
    cout << test().yourAge << endl;  // Iwas expecting 60 but giving me againg 0

    cout << obj.yourAge << endl;  // I was expecting garbage but giving me 0;



    return 0;
}

我已经在代码中描述了我的问题,但为什么它们给出了意想不到的结果。为什么会这样?是因为我正在使用临时无名对象还是发生了其他事情?我将感谢您的回答。

最佳答案

在任何使用test() 的地方,您都会构建一个类型为test 的临时对象,该对象会按照您的类中的指定进行初始化。
此初始化对于 num 成员是 30,但对于 yourAge 成员可以是任何东西(静态存储除外,但这是另一个主题)。

然后像 test().yourAge 这样的任何表达式都会构建一个临时对象,检索它的 yourAge 成员,该成员的值是未初始化(它可能是-17、0 或其他)并让这个临时对象消失。

当调用 test().set() 时,您创建一个临时对象,通过 set() 方法初始化其 yourName 成员但是让这个对象消失而不使用它!
任何后续的 test() 表达式都是一个新的临时对象,没有理由与调用 set() 的对象相关。

obj 的情况类似,除了这个对象将持续到包含它的 block (这里的 main() 函数)被执行。
它的 yourAge 成员从未被初始化,所以它可以包含任何东西;如果您曾经使用过 obj.set(),那么在调用之后您可能会期望在 obj.yourAge 中找到相关内容。

关于c++ - 临时对象在 C++ 中的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57106062/

相关文章:

C++ 从 Atan 创建 Atan2

c++ - 排序对象和多态性

c++ - 如何在自定义类中启用 'auto loops'?

python 类的子类或实例

值为指针的 C++ Map

javascript - 未知的 Prop react

ios - ARC 不允许将非 Objective-C 指针类型 'int *' 隐式转换为 'Bird *'

javascript - 映射两个对象数组,匹配属性并将特定信息存储在新数组中

javascript - 无法迭代对象

c++ - 如何使用 Qt QwtPlot3D 可视化数据