C ++对象生命范围

时间:2016-01-17 02:20:26

标签: c++ object lifecycle

我似乎误解了c ++中对象的生命范围。如果您考虑以下因素:

class MyClass{
public:
    int classValue;
    MyClass(int value){
        classValue = value;
    }
    static MyClass getMyClass(int value){
        MyClass m1 = MyClass(value);
        return m1;
    }
};

int main() {
    MyClass m1 = MyClass(3);

    cout << m1.classValue << endl;
    m1 = MyClass::getMyClass(4);
    cout << m1.classValue << endl;    

    return 0;
}

输出:

3
4

我想,当m1获得一个非动态对象时,它已经在getMyClass函数的“堆栈”中创建,我试图从中获取一个值是行不通的,因为该对象将会死亡。有人可以开导我吗?不要遗漏任何细节!

1 个答案:

答案 0 :(得分:2)

  

我想,当m1获得一个非动态对象时,它已经在堆栈上创建了#39; getMyClass函数,我试图从中获取一个值是不行的,因为该对象将死亡。有人可以开导我吗?不要遗漏任何细节!

有一点误会。

是的,该对象是在getMyClass的堆栈上创建的 是的,当函数返回时,对象已经死了。

但是,行:

m1 = MyClass::getMyClass(4);

在对象死亡之前将函数的返回值赋给m1。该对象的使用寿命足以允许运行时完成分配。

BTW,该行

MyClass m1;

不正确,因为MyClass没有默认构造函数。你可以替换

MyClass m1;
m1.value = 3;

只是一个班轮

MyClass m1(3);

<强>更新

您需要更改MyClass的构造函数。

MyClass(int value){
    value = value; // This does not initialize the
                   // member variable of the class.
                   // The argument shadows the member variable.
}

使用:

MyClass(int valueIn) : value(valueIn) {}