3

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

 class Foo {
 public:
   BigStruct m_bigstruct;

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

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

 class Foo {
 public:
   BigStruct* m_bigstruct;

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

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

4

2 回答 2

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())还是左值,对象将被移动或复制:如果您有另一个对对象的引用,您通常不想窃取该对象,但复制它。

于 2013-07-26T22:11:12.163 回答
2

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

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

   Foo(BigStruct &inBigStruct) : m_bigstruct(inBigStruct) {}
 };
于 2013-07-26T22:08:43.207 回答