(新手学习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'创建一个副本?
答案 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;
…
};