将引用传递给 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()
函数就是这种情况,因为obj
在getExample2Object()
返回时被破坏。
【讨论】:
谢谢。这就是我的想法,但这让我怀疑自己:link @user1468729,在那个问题中myclass
有std::string
成员,而不是对std::string
的引用。
我的第一个 ExampleClass 也是如此。还是我在这里遗漏了什么?
@user1468729,你的ExampleClass
很好。另一个问题中的代码是合法的,我认为问题是问 what 如果我存储了引用。如果您注意到,该问题的已接受(且正确)答案还会声明要存储一份副本。【参考方案2】:
我想知道这些是否基本相同。
不,他们不是。 Example
的构造函数接受一个对象引用并构造一个成员对象以使用传递的对象。该对象不是引用而是副本。在Example2
的情况下,您实际上是在使objReference
引用在ctor 参数中传递的对象。只要newObj
有生之年,你就是好的。
Object obj;
return new ExampleClass2(obj);
是失败的经典案例。一旦函数返回,您将有一个悬空引用。
【讨论】:
以上是关于将引用传递给 C++ 构造函数并将它们保存为引用或非引用类型的主要内容,如果未能解决你的问题,请参考以下文章