为什么要重载以前未定义的运算符
Why are you overloading an operator that has not been defined before?
在下面的示例中,加法运算符已重载:
class CVector {
public:
int x,y;
CVector operator + (const CVector&);
};
但是你会说加法运算符对于 CVector 类型来说是重载的,而加法运算符以前甚至没有在此类中声明或定义过?
谢谢!
cppreference 将运算符重载简要定义为
运算符重载:自定义用户定义类型的操作数的C++运算符。重载运算符是具有特殊函数名称的函数。
所以运算符+
实际上是一个预定义名称operator+
的函数,它已经被用于几种类型。当您现在为用户定义的类型CVector
提供自定义的operator+
实现时,这被视为overloading
,因为您为各个参数的给定函数名称定义了不同的实现。
你会说加法运算符对于 CVector 类型来说是重载的,而加法运算符以前甚至没有在此类中声明或定义过吗?
是的。
假设您有:
int a = 10;
int b = 20;
如果使用 a + b
,则使用的是为 int
定义的 +
运算符的版本。
现在,假设您有:
std::string as;
std::string bs;
如果使用 as + bs
,则使用的是为 std::strings
定义的 +
运算符的版本。 因此,此+
运算符是与 std::string
一起使用的重载。
来到你的课堂,假设你有:
CVector v1 = { ... };
CVector v2 = { ... };
当你定义一个允许你使用 v1 + v2
的函数时,它是使用 CVector
的 +
运算符的重载。
它不是+
运算符的过载CVector
。
它是使用 CVector
s 的 +
运算符的重载。
相关文章:
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 未定义的引用和运算符 << vs me
- C++:对函子重载调用运算符的未定义引用
- 对模板运算符的未定义引用,其定义位于同一头文件中
- 在 tensorflow-GPU 中使用用户运算符时未定义的符号>=1.15
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- 调用提取重加载器会产生对"运算符"的未定义引用错误>>
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 编译Qt项目给出了对运算符delete(void*,unsigned int)的未定义引用
- 在 C 和 C++ 中,使用逗号运算符的表达式是否未定义"a = b, ++a;"?
- 未定义对运算符的引用!= 使用 std::unordered_set 时
- C2676 - 二进制'++'未定义此运算符
- 未定义 Lambda 复制分配运算符
- 为什么要重载以前未定义的运算符
- std::可选运算符*() 和运算符>() - 未定义的行为
- 对运算符>>的未定义引用会导致LINK2019
- 重复使用前缀 ++ 运算符时的未定义行为
- 当c 中的矢量容器过载[]运算符时,我对未定义的索引返回什么
- std::映射运算符[]--未定义的行为
- C2676 二进制"++":设置迭代器<TElement>未定义此运算符