【问题标题】:How temporary objects behave in c++?临时对象在 C++ 中的行为如何?
【发布时间】:2019-11-28 01:42:04
【问题描述】:

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

#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().set() 然后期望test().yourAge 以某种方式更改是错误的,因为在每种情况下,都会在表达式结束时创建和销毁新的临时对象。除了静态变量的情况外,不同的临时变量之间没有任何联系。

标签: c++ class object


【解决方案1】:

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

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

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

obj 的情况类似,只是该对象将持续到包含它的块(此处为 main() 函数)执行时。
它的yourAge 成员从未初始化,因此它可以包含任何内容;如果您曾经使用过obj.set(),那么在那次通话之后,您可能会期望在obj.yourAge 中找到相关的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2016-01-30
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    相关资源
    最近更新 更多