初始化成员变量而不创建新副本

时间:2013-07-26 22:07:17

标签: c++ class initialization

我有一个需要了解一些大型数据结构的类。因此,我创建了一个构造函数,它接受对该大型数据结构的引用,并使用它来初始化一个成员变量,如下所示:

 class Foo {
 public:
   BigStruct m_bigstruct;

   Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
 };

这似乎是inBigStruct的副本,但我不想浪费这些资源,因为BigStruct是巨大的。是否有更标准的方法使inBigStruct的内容可供Foo使用而不复制它?我知道我可以这样做:

 class Foo {
 public:
   BigStruct* m_bigstruct;

   Foo(BigStruct* inBigStruct) : m_bigstruct(inBigStruct) {}
 };

这是inBigStruct无需复制即可使用Foo的常用方法吗?如果不是,那是什么?

2 个答案:

答案 0 :(得分:3)

C ++ 2011方法是移动对象,例如:

Foo::Foo(BigStruct const& argument): m_bigstruct(argument) {}       // copies
Foo::Foo(BigStruct&& argument): m_bigstruct(std::move(argument)) {} // moves

当然,这假设BigStruct有一个合适的移动构造函数。根据是否传递临时(或通过std::move()看起来像临时的东西)或左值,对象将被移动或复制:如果您有另一个对象的引用,您通常不希望窃取对象但复制它。

答案 1 :(得分:2)

如果您确定在Foo活着时它不会失效,您可以存储参考。

class Foo {
 public:
   /*const*/ BigStruct& m_bigstruct;

   Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
 };