簡體   English   中英

C ++ Pass by Reference和Value and Const問題

[英]C++ Pass by Reference and Value and Const Issues

我有以下通用代碼,其中我有一個類在一些內存上實現視圖,這可以通過各種方式創建。 它用於為某些數據處理功能提供一致的接口。

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 & type,這是否意味着當我將這些方法傳遞給Process函數時會有雙重復制? 獲得理想行為的最有效方法是什么?

另一個問題是實現const正確性的正確方法是什么? 事實上,我永遠不希望的處理功能以改變的成員變量CView類,但我想在數據指針CView類是指向非const數據的第一個參數Process ,其是輸出圖。 如果我按值傳遞大概有一個const限定符沒有意義嗎?

你是對的,如果你通過值傳遞,就沒有必要使它成為一個const值。

要回答問題的第一部分,如果返回CView並將其傳遞給過程函數,則不會再次復制它,因為ProcessAddProcessReverseProcessMul函數的參數都是引用。 它將使用傳遞的相同CView對象。

如果要封裝CView對象,有一些更清晰的方法可能對您的應用程序有意義。 例如,您可以將視圖方法更改為如下所示:

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

然后,如果您對要修改的視圖有其他引用,則可以單獨保留Process函數。 但是,由於您看起來正在創建組合其他CView的新對象,因此您可以更改函數以直接返回新視圖:

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

你能通過價值傳遞你所有的CView嗎? 大概。 您的示例中的類型很小,因此副本可能不會產生太大差異。 如果對象具有任何重要的指針所有權規則(它看起來可能是這樣)或者可以擴展為具有更多信息,那么您可能只想從一開始就使用引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM