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

标签 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

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

最佳答案

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

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

关于传递给构造函数的临时对象的 C++ 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22055084/

相关文章:

c++ - std::lower_bound 的奇怪错误

c++ - 为什么当 d == 0 时 'd/= d' 不抛出被零除异常?

reference - 不能借用为可变的,因为它也被借用为不可变的

c++ - 在 C++ 中通过指针传递比通过引用传递有好处吗?

c - 当我尝试使用函数中通过引用传递的预分配矩阵读取值时出现段错误

java - 选择 Java 函数调用中的按值传递行为

java - JNI 将 long 值传递给本地方法

c++ - 了解纯虚函数

c++ - 为什么 boost 可选引用不是 T* 的包装器?

arrays - 如何总是做一个做作的副本?