2014-02-26 101 views
0

我有一個接受構造函數中的istream引用的類。如果構造函數通過臨時對象,如myclass obj(ifstream("filename"));那麼ifstream會對obj的生命有用嗎?它取決於它是否被分配給類中的引用或指針?傳遞給構造函數的臨時對象的C++壽命

例如:

class test 
{ 
public: 
    istream *p; 
    test(istream &is) 
    { 
     p = &is; 
     cout << "a constructor" << endl; 
    } 
    ~test() 
    { 
     cout << "a destructor" << endl; 
    } 
    bool isgood() 
    { 
     return p->good(); 
    } 
}; 

int main() 
{ 
    test test(ifstream("test.cpp")); 
    cout << test.isgood() << endl; 
} 

輸出:

a constructor 
1 
a destructor 

僅僅因爲輸出表示該文件是很好的,我不知道它是否被摧毀或什麼。如果有涵蓋此部分的標準,請告訴我。謝謝

+3

該代碼甚至不應該編譯... – 0x499602D2

+1

ifstream將在該塊的結尾處關閉並在此之後無效。 'p'會指向垃圾 – JoshG79

+0

我正在使用Visual Studio 2010. @Josh哪個塊結束?我試圖找出在構造函數中打開的fstream是否有效,直到main()結束。謝謝 – loop

回答

2

對不起,我沒有足夠的知名度評論。

臨時istream只在構造函數中有效。即使您使用istream的地址來設置指針的值,一旦構造函數返回,您將不再使用它。由於在構造函數調用之後,臨時ifstream已經被關閉並被銷燬。所以指針會像@Josh提到的那樣指向垃圾。您可以修改您的代碼以將文件名傳遞給構造函數,並使用文件名來初始化成員ifstream(不是指向ifstream的指針)。然後,您可以在對象的使用壽命中使用流。

相關問題