如何在C 中声明不变的类(Java示例)

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

本文关键字:Java 示例 声明      更新时间:2023-10-16

我该如何在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的"最终"更严格,是否有另一个关键字,或者有一种方法可以在声明const后初始化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最终成员变量的等效内容?这可能吗?

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)
{
}