传递给构造函数的临时对象的 C++ 寿命

Posted

技术标签:

【中文标题】传递给构造函数的临时对象的 C++ 寿命【英文标题】:C++ lifespan of temporary object passed to constructor 【发布时间】:2014-02-26 22:41:48 【问题描述】:

我有一个在构造函数中接受 istream 引用的类。如果向构造函数传递了一个像myclass obj(ifstream("filename")); 这样的临时对象,那么ifstream 对obj 的生命是否有好处?是否取决于它是否分配给类中的引用或指针?

例如:

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

仅仅因为输出表明文件很好,我不知道它是被破坏了还是什么。如果有部分标准涵盖了这一点,请告诉我。谢谢

【问题讨论】:

该代码甚至不应该编译... ifstream 将在块的末尾关闭并在此之后无效。 p 会指向垃圾 我正在使用 Visual Studio 2010。@Josh 哪个块的结尾?我试图弄清楚在构造函数中打开的 fstream 在 main() 结束之前是否有效。谢谢 这个问题很难回答,因为您的代码对语言使用了非标准的“扩展”。所以你必须在编译器的文档中查找它。 @juanchopanza 我不知道非标准扩展是什么,我想编写可移植的代码,所以请告诉我应该改变什么。 【参考方案1】:

抱歉,我没有足够的声望来发表评论。

临时的istream 只在构造函数中是好的。即使您使用istream 的地址来设置指针的值,一旦构造函数返回,您就不能再使用它。由于在构造函数调用之后,临时 ifstream 已经被关闭并销毁。因此,正如@Josh 提到的那样,指针将指向垃圾。您可以修改代码以将文件名传递给构造函数并使用文件名来初始化成员 ifstream(不是指向 ifstream 的指针)。然后,您可以在对象的整个生命周期内使用流。

【讨论】:

以上是关于传递给构造函数的临时对象的 C++ 寿命的主要内容,如果未能解决你的问题,请参考以下文章

使用标准构造函数传递临时对象

使用构造函数将数组传递给对象后,值已更改(在 c++ 中)。我想不通为啥

C++:调用临时对象的构造函数

为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?

c++的复制构造函数

传递给类构造函数的 C++ 字符串 - 链接器错误