const引用和创建副本

时间:2013-09-06 03:57:19

标签: c++

(新手学习c ++与现有代码库) 请考虑以下代码段:

class Filter
{
    ...
public:
    Filter();
    int addFilter(gFilter &filterDesc);
    …
};

class gFilter 
{
  public:
  ….
  inline const RangeOfUInt&  getProto() const
  {
       return proto; 
  }
  private:
     …
     RangeOfUInt   proto;
     …
};

typedef struct
{
    ValueType  type;
    uint32_t   value1;
    uint32_t   value2;
} UIntRange;

typedef std::list<UIntRange> RangeOfUInt;
…

const RangeOfUInt protos = filterDesc.getProto();   //  XXX

所以在这个例子中,getProto()返回const引用并为'protos'创建一个副本?

3 个答案:

答案 0 :(得分:2)

是的,你是完全正确的。 protos是根据getProto返回的引用制作的副本。 (调用者创建副本,getProto没有。)

答案 1 :(得分:1)

通常它会创建protos的副本,'通常',因为编译器可能会根据特定的代码路径添加一些优化,但在编码时我们不必担心。由于您只查找参考,因此以下更改将避免复制。

const RangeOfUInt& protos = filterDesc.getProto(); //Make the return variable a reference

答案 2 :(得分:0)

我认为如果你想要一个const引用,那么保持方法就像更改一样,你的调用由@jayadev注明为const RangeOfUInt& protos = filterDesc.getProto();如果你想修改一个副本,那么让一个方法调用只返回一个复制。如果您正在使用c ++ 11大多数项目(不确定ValueType是什么)似乎移动可构造并且使用复制值优化,您将不会失去性能,它将直接构造到新对象中。 (见NVRO)

RangeOfUInt protos = filterDesc.getProto();

class gFilter 
{
  public:
  ….
  inline RangeOfUInt  getProto()
  {
       return proto; 
  }
  private:
     …
     RangeOfUInt   proto;
     …
};