按值:
class Test {
private:
HugeObject h; // Copy 1
public:
void SetObject(HugeObject hugeObject) { // Copy 2
h = hugeObject; // Copy 3
}
}
// Somewhere else
Test t();
t.SetObject(HugeObject());
这很糟糕,因为创建了三个隐式拷贝。如果我更改 SetObject()
的参数至 const HugeObject& hugeObject
,这也很糟糕,因为我会存储一些在该函数范围之外不再存在的东西。
所以,为了防止复制两次和存储无效数据,我可以只复制两次:
void SetObject(const HugeObject& hugeObject) {
h = HugeObject(hugeObject); // Copy constructor
}
这是处理这种情况的有效方法还是我误解了什么?愚蠢的优化还是根本不是优化?除了存储指针之外,还有更好的方法吗?
最佳答案
当您在类中首先声明 h
时,您实际做的是调用对象的默认构造函数,它在创建对象时隐式调用' 使用明确的语法;也就是说,
HugeObject h; // Calls default constructor implicitly.
HugeObject h2 = HugeObject(); // Still calls default constructor.
HugeObject ougeHobject = HugeObject(h); // Calls copy constructor.
h2 = ougeHobject; // calls HugeObject's operator=
最后一部分是我真正要说的。当您在 SetObject
中将 h
分配给 hugeObject
时,您实际上是在使用 HugeObject
的 operator=
。这与构造不是一回事。如果 operator=
不是由类定义的,那么 C++ 实现会合成它;此默认值通过将基本类型(例如 double
)的右侧对象的每个成员分配给左侧对象的相应成员来工作。对于存储为 hugeObject
变量的类类型,调用它们对应的 operator=
。
现在直接回答这个问题,如果你想限制你制作的拷贝,只需将 h 分配给 SetObject
中的 hugeObject
的引用,因为两者都有已经实例化:
void SetObject(const HugeObject& hugeObject) {
h = hugeObject;
}
虽然技术上超出范围,const HugeObject&
的值通过 HugeObject
的 operator=
复制到 h
。这不会隐式构造一个新对象,因为两者都已经实例化了;同样,它只是调用 operator=
。
关于c++ - 从 const 引用参数存储成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551735/