6

我从 C# 来到 C++ 并且 const 正确性对我来说仍然是新的。在 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; }
};

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

4

3 回答 3

8

有一个const修饰符:

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

public:
    Type(int y):_x(y) { j = 5; }
    int get_x() { return _x; }
    // disable changing the object through assignment
    Type& operator=(const Type&) = delete;
};

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

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

   struct Type
   {
      const int x; 
      const int y;

      Type(int vx, int vy): x(vx), y(vy){}
      // disable changing the object through assignment
      Type& operator=(const Type&) = delete;
   };
于 2013-09-12T22:44:29.377 回答
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) {  }
};

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

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

于 2013-09-12T22:47:58.420 回答
0

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

文件.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();
        };
    };

文件.cpp

void Init()
{
//Some Logic intialization
}
于 2019-06-05T03:38:10.057 回答