c++ - 为什么要重载运算符以及如何使用其原始功能?
问题描述
我很难理解为什么有人要重载运算符。我知道它可以帮助重新分配功能,但它也带走了关键功能。
在给我的作业中,我得到了一个Vector4f
重载的骨架代码,=
现在在创建将矩阵转换为单位矩阵的函数时Matrix4f.h
,我无法使用=
(矩阵设置为 a float
,而不是int
)。
原始功能是否丢失了,还是我需要以=
某种方式进行类型转换?另外,为什么重新分配核心功能运算符是个好主意?我的教授建议我们可以做到add()
并超载,但没有。
解决方案
运算符重载是一种添加一些语法糖以帮助您的类型拥有完整、语义一致的 API 的方法。
举个例子,std::string
。就纯赋值运算符而言,它提供了多种方法来帮助字符串以连贯且语义合理的方式运行。除了复制/移动operator=
重载之外,它还提供:
operator=(CharT)
: 分配给一个角色operator=(const CharT*)
: 分配给字符串文字或指向 C 样式字符串的指针
这允许它以消费者期望的方式运行,例如:
auto str = std::string{""};
str = "hello world"; // c-style string/string literal
str = 'c';
此示例中的其他运算符为:
operator+(const CharT*)
: 附加 c-strings/string 字面量operator+(CharT)
: 追加字符operator+(const basic_string&)
: 追加std::string
其他- 等式或比较运算符(
operator==
、、operator<
等):以连贯的方式比较事物
添加运算符不会删除功能。它通过提供语义清晰的代码编写方式来帮助扩展功能。
注意:赋值运算符是一种特殊情况,在某些情况下可能会导致编译器生成operator=
的被删除。但是,您始终可以手动定义它,或者显式使用= default
语法重新启用它。例如:
class Foo
{
public:
...
Foo& operator=(const Foo&) = default; // Explicitly ask for the compiler-generated one
};
不支持此类运算符的语言可能会导致编写代码时必须将所有内容都写出来。例如:
string("hello").append(' ').append("world")
而不是简单地
std::string{"hello"} + ' ' + "world";
(这些是人为的例子)
编辑:上面的答案更多地集中在您的直接问题上,即为什么要重载运算符。如您的屏幕截图所示,您的错误似乎是由于缺少将(或其他一些可数字转换的类型,如 a )分配给该类型的operator=
重载。定义自定义运算符将启用此功能。int
float
Vector4f
推荐阅读
- python - 有没有更好的方法来遍历集合 (A, B, C) 选择 (a, b, c)
- ios - 如何知道图像属于哪个类?
- html - 如何正确使用 XPath 前同级?
- android - 如何在颤振中创建自定义步进器?
- fb-hydra - 如何从配置中配置 hydra 输出目录?
- google-cloud-platform - GCP Cloud SQL 未能删除实例,因为 `deletion_protection` 设置为 true
- azure - Azure 容器 - 与远程容器实例上的文件交互
- ruby-on-rails - 获取我的关联的 current_index
- pascal - 如何找到给定字符串中的单词数?
- tensorflow - 将 TensorFlow 1 代码移植到 TensorFlow 2(没有 sess.run 的模型学习过程)