在同一个类中使用访问器

时间:2009-05-21 21:43:29

标签: c++ accessor

我听说在C ++中,在定义访问器的同一个类的成员函数中使用访问器(get...())是很好的编程习惯吗?是真的吗?应该这样做吗?

例如,这是首选:

void display() {
    cout << getData();
}

这样的事情:

void display() {
    cout << data;
}

data是定义访问者的同一个类的数据成员...与display()方法相同。

我正在考虑这样做的开销,特别是如果你需要在同一个类中多次调用访问器而不是直接使用数据成员。

7 个答案:

答案 0 :(得分:9)

原因是如果您更改getData()的实施,则无需更改直接访问data的其余代码。

而且,智能编译器无论如何都会内联它(它总是知道类中的实现),因此没有性能损失。

答案 1 :(得分:1)

这取决于。使用访问器功能提供了一个抽象层,这可以使将来对“数据”的更改减少痛苦。例如,如果您想懒洋洋地计算“数据”的值,则可以在访问器函数中隐藏该计算。

至于开销 - 如果你指的是性能开销,它可能是微不足道的 - 你的访问器几乎肯定会被内联。如果你指的是编码开销,那么是的,这是一个权衡,你必须决定是否值得提供访问者的额外努力。

就个人而言,在大多数情况下,我认为访问者不值得。

答案 2 :(得分:1)

是的,我认为应该无条件地做或多或少。如果状态变量在某个基类中,它应该或多或少总是私有的。如果您允许它受到保护或公开,则所有继承的直接使用它。反过来,这些类可能是您的同事在其他项目中编写的类。如果你突然决定在基类中进行模拟并重构,例如变量名称更合适,必须重写该状态的所有用户。

如果您是唯一的程序员或开发一些人们无法使用的代码,那么这可能不是问题。但是一旦子类的数量开始增长,它就会变得非常毛茸茸。一定要喜欢透明度!

但是,我不是这个星球上最好的神。有时我作弊;)当你在所有者班级时,我认为可以直接访问私人数据。它甚至可能是有益的,因为你自动知道你正在修改你所在的实际类。鉴于你有某种实际告诉你的命名约定,例如一些变量名称,末尾带有下划线:“someVariable _”。

干杯!

答案 3 :(得分:0)

好吧,Khunt先生,在大多数情况下,开销对于访问者来说真的微不足道。问题是是否需要调用访问器逻辑,或者您是否需要直接访问该字段。这是每个单独实施的问题,但在许多情况下,不会产生太大的影响。

访问器的真正原因是将字段封装到其他类 - 而不是包含类。

答案 4 :(得分:0)

就个人而言,我不希望有几十个额外的功能(每个成员变量获取和设置)。我只会使用数据,并且只有在需要采取不同的操作时才会更改为 getData()。由于我们只讨论在一个类中更改代码,因此不应该太困难。

答案 5 :(得分:0)

这取决于您最终可能会对您的数据成员做些什么。

通过将其包装在访问器中,您可以执行诸如懒惰检索数据之类的操作(如果这是一个昂贵的过程而不是您想要做的事情,除非有人要求它)。另一方面,你可能知道它总是一个愚蠢的内置类型,所以我看不到通过那里的访问器的任何优势。正如我所说,这取决于会员。

答案 6 :(得分:0)

在我看来,这个问题最重要的方面是它是否使代码更具可读性,因此可维护?我个人认为不这样做,我不会这样做 当然,你不应该只是添加一个私人访问器,这将是cnuts。