2016-01-17 65 views
-2

我似乎错误地解释了C++中对象的生命范围。如果您要考虑以下几点: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的“在堆栈上”创建函数,我试图从它得到一个值是行不通的,因为这个对象将会死掉。有人能启发我吗?不要饶恕我任何细节!

+0

示例代码甚至不进行编译。 main()尝试使用未声明的默认构造函数实例化MyClass。我甚至不会提到类在构造函数中存在的明显错误。投票结束这个问题作为一个错字。 –

+0

好像你误解了“课堂”。也许我错了,但我不明白为什么你真的需要一个类。 –

+0

是的..对不起回合.. ..有更多的东西在那里,并没有正确删除它.. – Jakub

回答

2

我想,当m1得到一个非动态对象,它已经在getMyClass函数的堆栈上创建了,我试图从它获取一个值是行不通的,因为对象会死了。有人能启发我吗?不要饶恕我任何细节!

有点误解。

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

然而,线:前的对象是死

m1 = MyClass::getMyClass(4); 

分配功能来m1返回值。该对象的寿命足以让运行时间完成分配。

BTW,行

MyClass m1; 

是不正确的,因为MyClass没有一个默认的构造函数。您可以通过只是一个衬垫

MyClass m1(3); 

更新

您需要更改的MyClass构造替换线

MyClass m1; 
m1.value = 3; 

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

'MyClass m1(3);'也将有一个问题:'价值=价值;'在构造:) –

+0

@Danny_ds,好眼睛:) –

+0

@RSahu谢谢你的回复:)我仍然没有得到的是,从我的角度来看,我返回的对象在我返回并分配它之后超出了范围,那么m1如何仍然有存储在它的对象?这是对象的副本吗? – Jakub