调用this-> get/this-> set方法与直接访问C++中的成员变量

dim*_*ura 5 c++

假设我有一个类Foo,其中bar_包含一个包含某个状态的私有变量Foo.如有必要,我可以编写公共get/set方法bar_.当然,我尽可能地避免这种情况来维持封装.

假设我有这些get/set方法,每当我必须bar_在属于的方法中访问或修改时Foo,我通常直接执行它bar_,而不是使用get/set方法,我用它来bar_从类外部进行访问.除了关于直接访问变量的速度与调用方法的关注之外,我没有任何理由,但我怀疑如果get/set方法是内联定义的(它们是),它应该没有区别.这有什么不同吗?是否const内斯在其中发挥的作用?

到目前为止,我没有遇到任何问题,但我有一种挥之不去的感觉,我做错了.没有做任何令人信服的论据吗?关于这个的任何指导?

T.E*_*.D. 14

我知道它接近于此,但我讨厌获取/设置方法.厌恶他们.几乎从不写它们.

一般来说,一个类应该提供比直接更多的高级操作,并且只是简单地读取和修改内部状态变量,或者它应该偏离方式并且行为就像struct它一样.

即使我写一个,我几乎从来没有使用它里面的类.它们的重点在于您可以在不影响客户的情况下更改事物的内部表示.在课堂上,它是你关心的内部表现!如果你想在类中使用自己的接口对类进行大量操作,那么你可能会有第二个类在那里争取离开.

  • 我认为你提出了一个很好的观点.太多人似乎认为面向对象编程正在为每个成员变量编写一个getter和setter.正确的做法是创建一个高级接口,其中可能包括该接口的某些属性的getter和setter. (4认同)

GMa*_*ckG 5

除了关于直接访问变量的速度与调用方法的关注之外,我没有任何理由,但我怀疑如果get/set方法是内联定义的(它们是),它应该没有区别.这有什么不同吗?constness在这方面发挥了作用吗?

内联关键字在编译器是否进行任何内联时几乎不起作用.在这方面对关键字的使用基本上已被弃用.现代编译器内联就像疯了一样,他们知道什么时候可以更好地完成任何程序员的工作.

任何值得污垢的编译器会说"嗯,调用这个函数来获取这个成员变量;嘿,我可以得到成员变量!" 你什么都不担心.无论任何内联关键字,都会发生这种情况

也就是说,我几乎总是使用成员函数.如果我改变变量在访问时的行为方式,我现在"自动"应用它在任何地方使用它.干净的代码应该是你的目标,但不是教条"总是跳过功能".

任何时候我只想要一个变量值,我使用相应的成员变量.(也就是说,如果我在写作std::vector,如果我需要检查尺寸是否小于某些东西,我会说size() < x).但是如果直接使用变量更清晰,那就改为使用变量mSize++.

const - 无关紧要.如果你处于非const函数中,你将使用getter的非const版本,与const相同.显然,使用成员直接维持const-ness.没有区别.

  • "如果我需要检查大小是否小于某个东西,我会说size()<x)" - 特别是因为`size()`可能会被实现为`mEnd - mBegin`.这是一个非常好的例子,说明为什么某个*current*实现中的getter在某些*future*实现中可能不是getter(或具有相应的成员变量)."这是私有成员Blah的getter/setter"是描述接口的一种不好的方式:它提到了一个实现细节.我支持你避免它和布鲁克斯的声明,如果你要避免它,总是避免它:-) (3认同)