C ++ Pass by Reference和Value and Const问题

时间:2014-06-12 03:50:35

标签: c++ const pass-by-reference pass-by-value

我有以下通用代码,其中我有一个类在一些内存上实现视图,这可以通过各种方式创建。它用于为某些数据处理功能提供一致的接口。

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类中的数据指针指向{const}的第一个参数的非const数据{1}}这是输出视图。如果我按值传递大概有一个const限定符没有意义吗?

1 个答案:

答案 0 :(得分:3)

你是对的,如果你通过了价值,就没有必要把它变成const值。

要回答问题的第一部分,如果您返回CView并将其传递给流程函数,则不会再次复制,因为ProcessAddProcessReverseProcessMul函数的参数都是引用。它将使用传递的相同CView个对象。

如果要封装CView对象,有一些更清晰的方法可能对您的应用程序有意义。例如,您可以将视图方法更改为:

const CView& View() const { return m_view; }

如果您对要修改的视图有其他引用,则可以单独保留Process函数。但是,由于您看起来正在创建组合其他CView的新对象,因此您可以更改函数以直接返回新视图:

CView ProcessAdd(const CView &src1, const CView &src2);

你能按价值传递所有CView吗?大概。您的示例中的类型很小,因此副本可能不会产生太大差异。如果对象具有任何重要的指针所有权规则(它看起来可能是这样)或者可以扩展为具有更多信息,那么您可能只想从一开始就使用引用。