[英]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.