将公共成员设置为只读

making public member read only

本文关键字:只读 设置 成员      更新时间:2023-10-16
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;
}

我正在尝试使成员变量可访问,但只能通过界面读取。目前我已经尝试了这种方法,它似乎编译得很好。我对原始变量int a进行了const reference,并使其public。这种做法有什么问题,我可能会错过吗?或者这个例子是否安全无虞,可以用于实际目的?

提供应用了const正确性的成员函数没有错(我也使用它并打算一直这样做),但是如果我必须提供一个变量,我问这种方式有什么问题只是只读的。

谢谢:)

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

如果我必须提供一个只读的变量,这种方式有什么问题吗

对于 A 类,这种设计决策至少有几个缺点。

1:班级规模

正如迪特尔·吕金(Dieter Lücking)在评论:

不必要地增加班级规模

2:复制语义

它破坏了编译器生成的副本赋值运算符。例如,以下代码行为通常是可取的,但不起作用。

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

更多信息:

  • 我应该更喜欢成员数据中的指针还是引用?
  • 具有引用类成员的赋值运算符
  • Thinking in C++, 2nd ed. Volume 1 ©2000 by Bruce Eckel, 11: References & the Copy-Constructor

使用引用时有某些规则:

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

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

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

在 C++ 中执行此操作的标准方法是使实际成员private,但为接口包含一个公共的"getter"方法,如下所示:

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 检索其值。