C ++通过引用传递以及价值和缺点问题

机器人臭虫

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

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方法返回aCView而不是CView &类型,这是否意味着当我将它们传递给Process函数时将进行双重复制获得所需行为的最有效方法是什么?

另一个问题是实现const正确性的正确方法是什么?我实际上从不希望过程函数更改类的成员变量CView,但我确实希望类中的数据指针CView指向非常量数据,因为第一个参数Process是输出视图。如果我按值传递,那么拥有const限定词毫无意义吗?

德里克德曼

没错,如果您通过价值传递,则无需使其成为const价值。

要回答你的问题的第一部分,如果你返回CView,并将其传递到处理功能,也不会再因为复制的ProcessAddProcessReverseProcessMul功能的论点都是引用。它将使用与CView传递的对象相同的对象。

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

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

然后,如果您还有其他要修改的视图引用,则可以不理会Process函数。但是,由于您似乎正在创建将其他CViews组合在一起的新对象,因此可以更改函数以直接返回新视图:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章