簡體   English   中英

無需在C ++中復制即可使變量不可更改

[英]Make variable unchangeable without copying in C++

我正在編寫一些代碼,在這些代碼中,在指定值之前聲明了std::vector<double>類型的變量。 我無法與聲明一起定義值,因為它需要多行代碼來設置值。 問題在於,這個變量本質上是一個常量,這意味着它一旦設置就不應該被修改。 但是,它不能聲明為const

一種方法是創建另一個const變量並將值復制到其中。 const std::vector<double> a(b); 會這樣做,並在程序中使用a而不是b 但是,我的變量可能很大,我希望學習除了必須執行復制之外的其他方法。

你們有什么建議嗎?

您可以創建一個函數來初始化它。 在最壞的情況下,你有一個move 充其量你有(N)RVO(返回值優化)。

std::vector<Object> CreateBigVector();

接着

const std::vector<Object> myObject = CreateBigVector();

我認為問題在於范圍界定 您必須將問題分成兩個不同的范圍

  • 構建向量的范圍
  • 您使用它的一個(或其他)范圍

構建 vector的范圍內,它在邏輯上不是const變量。 一旦你構建它,你希望它不再被改變。 所以你可能想通過const &引用它。

我會這樣走:

  • 定義函數std::vector<double> build_up()
  • build_up ,你定義了一個非const vector ,你可以構建它
  • 當你完成后,你可以按值返回( RVO將避免任何副本)
  • build_up()返回的對象稱為const對象

const std::vector<double> v = build_up();

一種方法是創建一個函數

std::vector<Object> CreateYourVector();

並用它來初始化

const std::vector<Object> vec = CreateYourVector();

另一個(技術上是一種變體)是創建一個包含vector的輔助類,並在構造函數中完成所有工作

class Helper
{
     std::vector<Object> vec;

     public:

         Helper()
         {
               // initialise your vector here
         };

         const std::vector<Object> &TheVec() const {return vec;};
};

const Helper helper;

可以組合上述技術,例如改變構造函數

Helper() : vec(CreateYourVector()) {};

這些技術也可以與其他技術混合,例如單例模式。

c++11 ,您可以使用initial list來定義const vector 我認為這是最簡單的方法。 試一試: const vector<double> = {1.0, 2.0, 3.0}; 設置值不需要多行代碼。 我希望這可以幫到你。

傳統的方法是僅公開一個強制執行const的句柄,並避免在創建和初始化向量的上下文之外制作昂貴的副本。 這樣的句柄將是一個const指針或引用。

由於你使用的是std::vector你可以從現代的c ++工具中受益,因為std::vector支持像現成的移動語義這樣的功能。

特別是,我建議您預算一段時間來查看:

  • 移動語義
  • 智能指針

它改進了傳遞原始指針的傳統方式。 它們強制執行所有權語義(該上下文擁有該​​對象),並允許您通過代碼以非常精確的方式表達您的意圖。

暫無
暫無

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

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