访问属性或使用getter方法?

时间:2016-06-04 18:52:40

标签: c++

作为一名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方法,以防我想重命名该属性。但是现在我正在写一个方法,它会非常(经常)访问该属性。

5 个答案:

答案 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
        }
  }