簡體   English   中英

如何在C ++中聲明不可變類(Java示例)

[英]how can I declare an immutable class in C++ (Java Example)

我怎么能用C ++做到這一點?

//java example
public class MyImmutable {
     private final int numToBeInitializedOnConstructionOrCompilationError;

     public MyImmutable(int n) {
         this.numToBeInitializedOnConstructionOrCompilationError = n;
     }
}

對於Java,如果最終屬性在聲明時未初始化,或者在構造函數上編譯器將錯誤輸出,則此代碼有效,因為成員變量在構造函數中初始化。 如何在C ++中的類聲明中強制實現不變性?

(僅定義公共getter方法不是一個可接受的答案,我知道'const'必須是解決方案的一部分)

如果我在C ++中這樣做:

class MyImmutable 
{
  private:
     const int numToBeInitializedOnConstruction;

  public:
     MyImmutable(int n);
};

MyImmutable::MyImmutable(int n) 
{
  numToBeInitializedOnConstruction = n;
}

我得到以下錯誤,基本上告訴我我不能分配const成員,所以我猜const比java''final'更嚴格,是否有另一個關鍵字,或者有一種方法在聲明后初始化const?

$ gcc const.cc 
const.cc:10:10: error: constructor for 'MyClass' must explicitly initialize the const member
      'numToBeInitializedOnConstruction'
MyClass::MyClass(int n) {
         ^
const.cc:3:13: note: declared here
  const int numToBeInitializedOnConstruction;
            ^
const.cc:11:36: error: read-only variable is not assignable
  numToBeInitializedOnConstruction = n;
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
2 errors generated.

那么如何在C ++中聲明java final成員變量的等價物呢? 這可能嗎?

C ++可以以比Java更好的方式處理對象不變性。 首先,您可以使用const限定符從幾乎任何類型中創建一個不可變對象。

const string str = "asd";
const MyClass myObj(1);

你也可以使用像numToBeInitializedOnConstruction那樣的常量屬性,但它必須在構造函數的成員初始化列表中初始化,如下所示:

MyImmutable::MyImmutable(int n)
 : numToBeInitializedOnConstruction(n) // like this
{
}

使用初始化列表如:

MyImmutable::MyImmutable(int n): numToBeInitializedOnConstruction(n) {}

編輯:只是一個更好的縮進。

要聲明一個不可變對象 ,只需將其聲明為const

const Foo myImmutableFoo;

要聲明類的不可變屬性,可以聲明這些成員const - 但是您沒有使用正確的語法來初始化它們。 鑒於:

class Foo
{ 
  const int mImmutableN;
public:
  Foo();
}; 

你不能在構造函數的主體中初始化mImmutableN ; 它必須在構造函數的初始化列表中初始化:

Foo::Foo()
:
  mImmutableFoo (42)
{
}

暫無
暫無

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

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