作为一名C ++初学者,到目前为止我还没有想过这么多,但是如果我想从一个类本身中访问,我应该直接访问该属性还是使用一个吸气功能?
class foo
{
public:
int getVal();
void bar();
private:
int val;
}
foo::bar()
{
int val = this->getVal();
// or
int val2 = this->val;
}
我想知道
a)什么是更好的设计和(更重要的是对我来说)
b)任何性能差异(可能是因为调用该函数的开销)?
我通常在类中使用getter方法,以防我想重命名该属性。但是现在我正在写一个方法,它会非常(经常)访问该属性。
答案 0 :(得分:2)
这取决于。 Getter可能具有同步,如果从已持有锁的方法调用,则可能会使应用程序死锁。或者,相反,getter可以计算/记录对资源的访问。或者,类可能是字节缓冲区上的接口,getter / setter动态解组/编组有线数据,在这种情况下,调用getter和setter是不可避免的。
唯一的通用规则 - 在代码库中保持一致,并尽量不要使设计过于复杂。
答案 1 :(得分:1)
基本上,getter和setter用于隐藏复杂性,或者更好地说,从类中抽象出细节。所以它们不是强制要求在课堂内使用。
我可以说,如果你没有吸气剂,你就不需要这样做,因为在课堂内使用。 但是如果你有一个getter,你应该总是使用它,无论是在类的内部还是外部,因为你可能已经在getter中的原始值中应用了一些逻辑。
答案 2 :(得分:1)
我不同意@ user3535256。也应该在私有类函数中使用getter和setter。 getter和setter背后的想法是使代码更改变得简单易行。 @StanE想到你使用没有getter函数的类成员变量的情况,并且在一段时间之后你想要更改名称更有意义。此示例强制您更改其使用的每个位置的成员名称。如果对您的变量使用getter方法,则只有类getter函数会受到此代码更改的影响。
答案 3 :(得分:0)
在课堂内总是使用属性本身。你有一个getter的原因是为其他类提供一定的值。小心自动为您使用的每个属性制作getter。揭示一个类的内部工作被认为是不好的设计。有时将属性设置为有意义,有时它只是供内部使用,而其他类没有业务检查它们。
如果你想了解更多关于这个谷歌" getters setters evil"你可能会发现的一些文章非常极端,但他们会解释为什么会这样。
答案 4 :(得分:0)
这取决于你班级的内部。假设你有一个包含值的简单类,并且你想要计算访问该值的频率,但是有不同的getter方法(我必须承认它是一个非常人为的例子)。不是在每个方法中进行簿记,而是更容易只进行一次并在类中使用getter:
class CountedValue{
private:
int value;
int counter;
public:
CountedValue() : value(0),counter(0) {}
int getValue() const {
counter++;
return value;
}
int getMinusValue() const {
return - getValue();
}
// ... possibly more methods to retrieve the value
int getCounter() const { return counter;}
}
实际上,对于setter而言,在课堂内使用它们的好处也变得更加明显。您通常只想进行簿记并仅定义成员的不变量,而不是每次都可以更改。 例如:
class Rational {
private:
int numerator;
int denominator;
public:
void setNumerator(int n) { numerator = n; }
void setDenominator(int d) {
assert(d != 0 && "division by zero");
denominator = d;
}
void set(int n, int d) {
setNumerator(n);
setDenominator(n); // no need to check for 0 again
}
}