在C ++类或结构上声明只读变量

时间:2013-09-12 22:42:49

标签: c++ struct const

我是从C#来到C ++而const-correctness对我来说还是新手。在C#中,我可以声明这样的属性:

class Type 
{
    public readonly int x;
    public Type(int y) 
    {
        x = y;
    }
}

这将确保x仅在初始化期间设置。我想在C ++中做类似的事情。我能想到的最好的是:

class Type
{
private:
    int _x;
public:
    Type(int y) { _x = y; }
    int get_x() { return _x; }
};

有更好的方法吗?更好的是:我可以使用结构吗?我想到的类型实际上只是一个数据集合,没有逻辑,所以如果我能保证只在初始化期间设置它的值,结构会更好。

3 个答案:

答案 0 :(得分:6)

有一个const修饰符:

class Type
{
private:
   const int _x;
   int j;

   // Prevent C4512 - remove operator=
   Type& operator=(const Type&); 
public:
    Type(int y):_x(y) { j = 5; }
    int get_x() { return _x; }

};

请注意,您需要在构造函数初始化列表中初始化常量。其他变量也可以在构造函数体中初始化。

关于你的第二个问题,是的,你可以这样做:

   struct Type
   {
      const int x; 
      const int y;

      Type(int vx, int vy): x(vx), y(vy){}

      private: // Prevent C4512
         Type& operator=(const Type&); 
   };

答案 1 :(得分:2)

您可以拥有一个常量集合,而不是常量集合。不变的属性似乎与您的用例有关,而与数据模型本身无关。像这样:

struct extent { int width; int height; };

const extent e { 20, 30 };

有可能拥有一个类的特定常量数据成员,但是你需要编写一个构造函数来初始化它:

struct Foo
{
    const int x;
    int & y;
    int z;

    Foo(int a, int & b) : x(a + b), y(b), z(b - a) {  }
};

(该示例还显示了需要初始化的另一种数据成员:引用。)

当然,结构和类是一回事。

答案 2 :(得分:1)

您可以使用构造函数初始化类const成员。如果需要在构造函数中添加其他逻辑,但在.cpp文件中而不是.h中,则可以创建一个私有方法并在构造函数中调用它。

File.h

    class Example 
    {
    private:
        const int constantMember1;
        const int constantMember2;
        const int constantMember3;
        void Init();
    public:
        Example(int a, int b) :constantMember1(a), constantMember2(b), constantMember3(a + b) {
           //Initialization
           Init();
        };
    };

File.cpp

void Init()
{
//Some Logic intialization
}