如何在C++中为类的每个成员编写赋值运算符
How to code an assignment operator for each member of a class in C++
我是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...
};
现在,假设我有一个非成员函数来模拟这些测量。。。非成员,因为我有一个大模型,并且我将每个方程作为一个小函数在model.cpp文件中实现。
bool ComputeWeight(Human * humanpt, double energy, int day){
humanpt->aWeight[day] = energy * 0.8;
}
现在,我开始讨论:很明显,我可以有一个名为setWeight(双倍能量,int-day)的成员函数,并这样做:
bool ComputeWeight(Human * humanpt, double energy, int day){
humanpt->setWeight(energy, day);
}
然而,在对大型模型进行编码时,计算新的数据成员值并通过集合函数在对象内更新它们是非常不切实际的。他们是否可以为类的每个数据成员编写运算符=的重载代码?因此,对于成员aWeight,我将有自己的运算符=,并像第一个示例中一样继续执行我的计算函数?
为类的每个成员重载赋值运算符(作为setter)有意义吗?
C++不允许为单个成员重载赋值运算符。直接分配给成员的唯一方法是将它们公开,然后根据成员的类型而不是包含类重载分配运算符。
另一方面,您可以(有时也应该)为类的成员提供setter方法。
我认为你把赋值运算符(如c = 10;
)和setter方法(如c.setWeight(10);
)混为一谈。这是两个完全不同的东西。
附录:
赋值运算符用于将一个对象的数据复制到另一个对象中。允许使用赋值运算符直接设置成员变量的唯一方法是将该成员声明为public。在面向对象编程中,这是不受欢迎的,因为它破坏了封装和数据隐藏。
相关文章:
- 清除具有已删除赋值运算符的成员的类实例
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- Clang 无法在赋值运算符/复制构造函数中检测到未初始化的类成员
- 是否应该在复制构造函数或赋值运算符中复制静态数据成员
- Gcc 使用 memcpy 作为隐式复制赋值运算符,而不是成员复制
- C++ 包含唯一指针成员变量的类的赋值运算符
- 是否有必要重载具有另一个类 B 的数据成员的类 A 的赋值运算符和复制构造函数?
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 模板的赋值运算符(成员函数)实现的正确语法
- 存在静态常量成员时的赋值运算符
- 具有std::原子成员变量的类的复制构造函数/赋值运算符出错
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 重载非类型模板结构的成员结构的复制赋值运算符
- STL - 赋值运算符与“赋值”成员函数
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 类内成员初始化是否删除赋值运算符
- 为什么引用类型成员会导致删除隐式声明的复制赋值运算符
- 类成员作为对另一个的引用:赋值运算符中的崩溃