我想知道这些是否基本相同。
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的构造函数不保存其构造函数中引用的对象的副本吗?
答案 0 :(得分:8)
ExampleClass
没问题,因为它需要构造函数参数中引用的对象的副本。
ExampleClass2
要求其构造函数参数中引用的对象在ExampleClass2
实例的生存期内存在(因为它存储对对象的引用,它不复制它)。如果没有,那么ExampleClass2
实例将在其引用的对象被破坏后立即具有悬空引用。这是getExample2Object()
函数的情况,obj
会在getExample2Object()
返回时被解析。
答案 1 :(得分:0)
我想知道这些是否基本相同。
不,他们不是。 Example
的构造函数接受一个对象引用,并构造一个成员对象来使用传递的对象。此对象不是引用,而是副本。如果是Example2
,您实际上是在objReference
引用ctor参数中传递的对象。只要newObj
的生命周期,你就是好的。
Object obj;
return new ExampleClass2(obj);
是失败的典型案例。函数返回后,您将有一个悬空引用。