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

Posted

技术标签:

【中文标题】将引用传递给 C++ 构造函数并将它们保存为引用或非引用类型【英文标题】:Passing references to a C++ constructor and saving them to reference or non-reference types 【发布时间】:2012-06-22 11:01:18 【问题描述】:

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

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

【问题讨论】:

您的代码无法编译,因为您无法将指针(由 getExampleObject 和 getExample2Object 返回)分配给非指针变量 ec 和 ec2。 是的,很抱歉,我忘了*号。 【参考方案1】:

ExampleClass 很好,因为它获取了构造函数参数中引用的对象的副本。

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

【讨论】:

谢谢。这就是我的想法,但这让我怀疑自己:link @user1468729,在那个问题中myclassstd::string 成员,而不是对std::string 的引用。 我的第一个 ExampleClass 也是如此。还是我在这里遗漏了什么? @user1468729,你的ExampleClass 很好。另一个问题中的代码是合法的,我认为问题是问 what 如果我存储了引用。如果您注意到,该问题的已接受(且正确)答案还会声明要存储一份副本。【参考方案2】:

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

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

Object obj;
return new ExampleClass2(obj);

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

【讨论】:

以上是关于将引用传递给 C++ 构造函数并将它们保存为引用或非引用类型的主要内容,如果未能解决你的问题,请参考以下文章

通过引用传递给构造函数

C ++通过引用将`this`传递给方法

传递给构造函数的临时对象的 C++ 寿命

为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?

通过指针或引用将映射传递给函数?

C,如何将多维数组传递给 CLR/类库项目中的函数