传递对C ++构造函数的引用并将它们保存为引用或非引用类型

时间:2012-06-20 10:12:58

标签: c++ reference constructor pass-by-reference

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

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的构造函数不保存其构造函数中引用的对象的副本吗?

2 个答案:

答案 0 :(得分:8)

ExampleClass没问题,因为它需要构造函数参数中引用的对象的副本。

ExampleClass2要求其构造函数参数中引用的对象在ExampleClass2实例的生存期内存在(因为它存储对对象的引用,它不复制它)。如果没有,那么ExampleClass2实例将在其引用的对象被破坏后立即具有悬空引用。这是getExample2Object()函数的情况,obj会在getExample2Object()返回时被解析。

答案 1 :(得分:0)

  

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

不,他们不是。 Example的构造函数接受一个对象引用,并构造一个成员对象来使用传递的对象。此对象不是引用,而是副本。如果是Example2,您实际上是在objReference引用ctor参数中传递的对象。只要newObj的生命周期,你就是好的。

Object obj;
return new ExampleClass2(obj);

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