返回带有const getter函数的成员对象,但它是可修改的

Returning member object with a getter function as const but it is modifiable

本文关键字:修改 成员对象 const getter 函数 返回      更新时间:2023-10-16

我有一个类,它的私有成员是一个对象,我已经设置了一个相应的getter:

class lepton {
private:
  TLorentzVector _p;
  ...
public:
  ...
  const TLorentzVector& p() const { return _p; }
};

和TLorentzVector类当然有它自己的函数和变量,例如,假设SetStuff(...)是一个函数。我们还假设SetStuff(...)修改了对象的私有变量。我的程序允许我调用

....
lepton foo;
foo.p().SetStuff(...);
....

我想知道这是怎么可能的,因为getter p()是const。使用允许修改类成员的getter是一种不好的方式吗?我最终采用了这种设置,因为在程序的另一点上,我想添加两个对象的_p (TLorentzVector对象)变量,如下所示:

lepton lep1;
lepton lep2;
....
auto combined_four_vector = lep1.p() + lep2.p();
....

如果轻子类中的getter定义为:

TLorentzVector& p() { return _p; }

我不能添加TLorentzVector对象。

你可以定义一个非常量重载和一个常量重载(除非你有任何理由不定义非常量重载):

class lepton {
    // ...
public:
    // ...
    TLorentzVector const& p() const { return _p; }
    TLorentzVector& p() { return _p; }
};

这样,对于接受lepton const&的函数和操作符,只有const重载可用,从而保持对象的const安全。


例如,下面的命令可以正常工作:

lepton foo;
foo.p().SetStuff(...);

,假设在TLorentzVector const&上定义了operator+,下面也可以正常工作:

auto res = lep1.p() + lep2.p();