2

(使用现有代码库学习 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' 创建一个副本?

4

3 回答 3

2

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

于 2013-09-06T09:25:24.493 回答
1

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

const RangeOfUInt& protos = filterDesc.getProto(); //Make the return variable a reference
于 2013-09-06T06:03:45.420 回答
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;
     …
};
于 2013-09-06T07:48:46.523 回答