c++ - 从 const 引用参数存储成员变量

标签 c++ reference parameter-passing constants pass-by-reference

按值:

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 时,您实际上是在使用 HugeObjectoperator= 。这与构造是一回事。如果 operator= 不是由类定义的,那么 C++ 实现会合成它;此默认值通过将基本类型(例如 double)的右侧对象的每个成员分配给左侧对象的相应成员来工作。对于存储为 hugeObject 变量的类类型,调用它们对应的 operator=

现在直接回答这个问题,如果你想限制你制作的拷贝,只需将 h 分配给 SetObject 中的 hugeObject 的引用,因为两者都有已经实例化:

void SetObject(const HugeObject& hugeObject) {
    h = hugeObject;
}

虽然技术上超出范围,const HugeObject& 的值通过 HugeObjectoperator= 复制到 h。这不会隐式构造一个新对象,因为两者都已经实例化了;同样,它只是调用 operator=

关于c++ - 从 const 引用参数存储成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551735/

相关文章:

c++ - 二进制 '==':找不到使用 'Enemy'类型的左操作数的运算符(或者没有可接受的转换)

c++ - 关于可维护性,映射表是比大型 switch 语句更好的设计吗?

c++ - 绑定(bind)功能麻烦

c - 是否可以使用格式说明符作为函数的参数

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

C++ 嵌套类,访问父变量

c++ - 使用自定义 TCL 解释器获取 "free(): invalid pointer"

javascript - 正确加载 Web 应用程序框架 (wicket) 中的资源 (javascript)?

c++ - 正在初始化类型为 "int &"的引用(不是 const 限定的),其值是 "bool"类型的一些 hack?

c# 在循环中更改 sql 的参数