Declaring readonly variables on a C++ class or struct

前端 未结 3 539
伪装坚强ぢ
伪装坚强ぢ 2021-01-05 07:39

I\'m coming to C++ from C# and const-correctness is still new to me. In C# I could declare a property like this:

class Type 
{
    public readonly int x;
            


        
相关标签:
3条回答
  • 2021-01-05 08:03

    You can initialize class const members with constructor. If you need add some other logic in constructor, but in .cpp file not in .h, you can create a private method and call it in constructor.

    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
    }
    
    0 讨论(0)
  • 2021-01-05 08:09

    There is a const modifier:

    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;
    };
    

    Note that you need to initialize constant in the constructor initialization list. Other variables you can also initialize in the constructor body.

    About your second question, yes, you can do something like this:

       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;
       };
    
    0 讨论(0)
  • 2021-01-05 08:11

    Rather than a collection of constants, you could have a constant collection. The property of being constant seems to pertain to your use case, not the data model itself. Like so:

    struct extent { int width; int height; };
    
    const extent e { 20, 30 };
    

    It's possible to have specifically constant data members of a class, but then you need to write a constructor to initialize it:

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

    (The example also shows another type of data member that needs to be initialized: references.)

    Of course, structs and classes are the same thing.

    0 讨论(0)
提交回复
热议问题