使公共成员只读

时间:2016-01-20 17:12:39

标签: c++ oop c++11

struct

我试图使成员变量可访问,但只能通过界面读取。目前我已尝试过这种方法,似乎编译得很好。我为原始变量class A{ private: int a; public: const int &ref = a; }; int main() { A obj; obj.a = 20; // error cause private obj.ref = 30; // not private but const so ERROR return 0; } 制作了const reference并将其设为int a。我可能会错过这种做法有什么不对吗?或者这个例子在实际应用中是否安全可靠?

提供具有public正确性的成员函数没有错(我也一直使用它并且打算一直这样做),但是我问这是否有任何问题如果我必须提供只读的变量。

谢谢你:)

2 个答案:

答案 0 :(得分:4)

class A{
    private:
        int a;
    public:
        const int &ref = a;
};
  

如果我必须提供一个只读的变量

,这种方式是否有任何问题

这个类A的设计决定至少存在一些缺点。

1:班级大小

同样提及Dieter Lücking comment

  

不必要地增加班级的规模

2:复制语义

它打破了编译器生成的复制赋值运算符。例如,通常需要以下代码行为,但不起作用。

A obj1;

// ...

A obj2;

// make changes to 'obj2'

// Update 'obj1' with the changes from 'obj2'
obj1 = obj2; // This copy doesn't work!

更多信息:

  

使用引用时有一些规则:

     
      
  1. 创建时必须初始化引用。 (指针可以随时初始化。)
  2.   
  3. 一旦将引用初始化为对象,就无法将其更改为引用另一个对象。 (指针可以随时指向另一个对象。)
  4.   
  5. 您不能拥有NULL引用。您必须始终能够假定引用已连接到合法的存储区。
  6.   

可能有可能实现自定义赋值运算符,但是需要维护更多代码(即我认为的另一个缺点)。

#include <iostream>

class A
{
private:
    int a;

public:
    explicit A(int value) : a(value) {}

    A& operator=(const A& other)
    {
        a = other.a;
        return *this;
    }

    const int& ref = a;
};

int main()
{
    A obj1(10);
    std::cout << "1: " << obj1.ref << "\n";

    A obj2(20);
    std::cout << "2: " << obj2.ref << "\n";

    obj1 = obj2;
    std::cout << "1: " << obj1.ref << "\n";

    return 0;
}

解决此问题的惯用方法是使用适当的访问器功能。

class A {
    private:
        int a;

    public:
        int getA() const { return a; }
};

答案 1 :(得分:3)

在C ++中执行此操作的标准方法是将实际成员private包括在内,但包括公开的&#39; getter&#39;接口的方法如下:

class A{
    private:
        int a;
    public:
        int get_a() const { return a; }

        A() : a(20) {}
};

int main() {
    A obj;
    int n = obj.get_a(); // n = 20
    return 0;
}

用户无法设置A::a的值,但可以使用A::get_a来检索其值。