如何在C ++中为类的每个成员编写赋值运算符

时间:2014-10-04 23:49:12

标签: c++ operator-overloading

我是C ++的新手,我现在正试图实施一个模型。那么,为一个类的每个成员重载一个赋值运算符(作为一个setter)是否有意义?如果非成员函数试图为私有/受保护数据成员设置新值,这将非常重要。例如:

class Human {
  private:
      double aWeight[100]; /* let's say I want to keep... 
...a set of 100 weight measures of this human.*/

    // member functions and constructors here...

    };

现在,让我们说我有一个非成员函数来模拟这些测量...非成员因为我有一个大型模型而且我将每个方程实现为模型中的一个小函数.cpp文件。

bool ComputeWeight(Human * humanpt, double energy, int day){

  humanpt->aWeight[day] = energy * 0.8;
}

现在,我开始讨论:显然我可以有一个名为setWeight的成员函数(double energy,int day),并且这样做:

bool ComputeWeight(Human * humanpt, double energy, int day){
   humanpt->setWeight(energy, day);
}

但是,在编写大型模型时,计算新的数据成员值并通过set函数在对象内更新它们是非常不切实际的。是否可以将operator =的重载编码到类的每个数据成员?所以我会拥有自己的operator = for member aWeight,完全按照第一个例子继续我的Compute函数?

1 个答案:

答案 0 :(得分:0)

  

为类的每个成员重载赋值运算符(作为setter)是否有意义?

C ++不允许您为单个成员重载赋值运算符。直接分配给成员的唯一方法是将它们公开,然后根据成员的类型而不是包含类来重载赋值运算符。

另一方面,您可以(有时应该)为类的成员提供setter方法。

我认为你正在将赋值运算符(例如c = 10;)与setter方法(例如c.setWeight(10);)混淆。这是两个完全不同的东西。

<强>附录:

使赋值运算符将一个对象的数据复制到另一个对象的数据。允许直接使用赋值运算符设置成员变量的唯一方法是将该成员声明为public。在面向对象编程中,这是不受欢迎的,因为它破坏了封装和数据隐藏。