【发布时间】:2014-08-02 07:01:20
【问题描述】:
我有以下通用代码,其中我有一个在某些内存上实现视图的类,可以通过多种方式创建它。用于为一些数据处理功能提供一致的接口。
class CView
{
...
int m_size;
float *m_data;
};
class CObjectA
{
...
CView m_view;
const CView View() const { return m_view; } // returned
CView View() { return m_view; } // returned
};
class CObjectB
{
...
const CView View() const { return CView(.....); } // constructed
CView View() { return CView(.....); } // constructed
};
void ProcessAdd(CView &dst, const CView &src1, const CView &src2);
void ProcessReverse(CView &dst, const CView &src);
void ProcessMul(CView &dst, const CView &src1, const CView &src2);
现在我想知道View 方法是否应该通过引用或值返回,以及Process 方法是否应该使用引用或值。我想尽量减少复制,但保留执行以下操作的能力:
CObjectA a1, a2;
CObjectB b1;
... init these somehow
ProcessAdd(a1.View(), b1.View(), a2.View());
似乎编译器不允许我让 View() 方法返回一个副本,然后通过引用传递给 Process 函数。
View 对象的重量相当轻,只指向可以读取或修改的数据。
如果View 方法返回CView 而不是CView & 类型,这是否意味着当我将它们传递给Process 函数时会有双重复制?获得所需行为的最有效方法是什么?
另一个问题是实现 const 正确性的正确方法是什么?我实际上从不希望进程函数更改CView 类的成员变量,但我确实希望CView 类中的数据指针指向Process 的第一个参数的非常量数据,即输出视图。如果我按值传递,大概没有 const 限定符?
【问题讨论】:
标签: c++ constants pass-by-reference pass-by-value