传递给构造函数的临时对象的C ++生命周期

时间:2014-02-26 22:41:49

标签: c++ reference pass-by-reference istream temporary-objects

我有一个接受构造函数中的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

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

1 个答案:

答案 0 :(得分:2)

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

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