C++对象生存范围

C++ object life scope

本文关键字:范围 对象 C++      更新时间:2023-10-16

我似乎误解了 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 函数的"堆栈"上创建,我试图从中获取值是行不通的,因为该对象将死亡。有人可以开导我吗?不要饶恕我任何细节!

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

有一点误会。

是的,对象是在 getMyClass 的堆栈上创建的。
是的,当函数返回时,对象已失效。

但是,该行:

m1 = MyClass::getMyClass(4);

在对象失效之前将函数的返回值分配给m1。对象的生存期足够长,以允许运行时完成分配。

顺便说一句,这条线

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) {}