c++ - 引用成员变量作为类成员

标签 c++ reference

在我的工作地点,我看到这种风格被广泛使用:-

#include <iostream>

using namespace std;

class A
{
public:
   A(int& thing) : m_thing(thing) {}
   void printit() { cout << m_thing << endl; }

protected:
   const int& m_thing; //usually would be more complex object
};


int main(int argc, char* argv[])
{
   int myint = 5;
   A myA(myint);
   myA.printit();
   return 0;
}

有没有一个名字来描述这个成语?我假设这是为了防止复制大型复杂对象可能产生的巨大开销?

这通常是好的做法吗?这种方法有什么缺陷吗?

最佳答案

Is there a name to describe this idiom?

在 UML 中称为聚合。它与组合的不同之处在于成员对象不被引用类拥有。在 C++ 中,您可以通过引用或指针以两种不同的方式实现聚合。

I am assuming it is to prevent the possibly large overhead of copying a big complex object?

不,那将是使用它的一个非常糟糕的理由。聚合的主要原因是包含对象不属于包含对象,因此它们的生命周期不受约束。特别是被引用对象的生命周期必须比引用对象的生命周期长。它可能已经创建得更早,并且可能在容器的生命周期结束之后存在。除此之外,被引用对象的状态不受类控制,但可以在外部改变。如果引用不是 const,则该类可以更改位于其外部的对象的状态。

Is this generally good practice? Are there any pitfalls to this approach?

它是一种设计工具。在某些情况下,这将是一个好主意,在某些情况下则不是。最常见的陷阱是持有引用的对象的生命周期不能超过被引用对象的生命周期。如果封闭对象在被引用对象被销毁之后使用引用,您将有未定义的行为。一般来说,组合比聚合更好,但如果你需要它,它和其他任何工具一样好。

关于c++ - 引用成员变量作为类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387239/

相关文章:

rust - 我可以用借用的元素来改变向量吗?

javascript - 防止通过引用创建的对象在原始对象更改时发生更改

java - 我想从我的 JButton 扩展中检索值

c++ - *(vec.begin() - 1) 应该返回什么?

c++ - 使用 http 调用连接 C++ 应用程序?

c++ - Qt QSpinBox 加速步长

perl - 子程序调用前的反斜杠

c++ - 为什么我不能让简单的数学工作?

c++ - gradle请参阅model.components.binaries.all的输出

java - Java 'pointers' 是整数吗?