7

我想知道这些是否基本相同。

class ExampleClass {
    public:
        ExampleClass(Object& newObj) : obj(newObj) {}
    private:
        Object obj;
}

class ExampleClass2 {
    public:
        ExampleClass2(Object& newObj) : objReference(newObj) {}
    private:
        Object& objReference;
}

那么这对任何一个课程都不起作用吗?

ExampleClass* getExampleObject() {
    Object obj;
    return new ExampleClass(obj);
}

ExampleClass2* getExample2Object() {
    Object obj;
    return new ExampleClass2(obj);
}

void main() {
    ExampleClass* ec = getExampleObject();
    ExampleClass2* ec2 = getExample2Object();
    //Do something involving the member objects of ec and ec2
}

那么在两个 getExampleObject 方法之后成员对象是否无效?ExampleClass 的构造函数不保存其构造函数中引用的对象的副本吗?

4

2 回答 2

9

ExampleClass很好,因为它需要在其构造函数参数中引用的对象的副本。

ExampleClass2要求在其构造函数参数中引用的对象在ExampleClass2实例的生命周期内存在(因为它存储对对象的引用,所以它不会复制它)。如果没有,那么ExampleClass2只要它所引用的对象被破坏,实例就会有一个悬空引用。getExample2Object()函数在返回obj时被破坏就是这种情况。getExample2Object()

于 2012-06-20T10:17:48.780 回答
1

我想知道这些是否基本相同。

不,他们不是。Example的构造函数接受一个对象引用并构造一个成员对象以使用传递的对象。该对象不是引用而是副本。在 的情况下Example2,您实际上是在objReference引用 ctor 参数中传递的对象。只要newObj有生之年,你就很好。

Object obj;
return new ExampleClass2(obj);

是失败的经典案例。一旦函数返回,您将有一个悬空引用。

于 2012-06-20T10:19:52.040 回答