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

C++ lifespan of temporary object passed to constructor

本文关键字:C++ 生命 周期 临时对象 构造函数      更新时间:2023-10-16

我有一个类,它在构造函数中接受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

仅仅因为输出说文件很好,我不知道它是否已被销毁还是什么。如果标准中有一部分涵盖此内容,请告诉我。谢谢

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

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