C ++创建新的运算符并重载当前运算符

时间:2019-05-30 13:56:44

标签: c++ operator-overloading

作为编写C ++的一部分,我正在编写用于转置矩阵的代码。我正在做的是运算符重载。但是,通常转置矩阵的符号是'

'甚至是运算符吗?我知道它是在' '之间表示一个字符,而如果使用" "则表示一个字符串。但是这些操作员不是吗?我可以将它们重载为单个字符还是整个字符?

我可以在C ++中创建仅对特定类的对象起作用的新运算符吗?我使用的技巧是重载+-^等已知的运算符,然后使用#define更改预处理器处理文本的方式,但是最后,我仍然会覆盖现有的运算符,并且不能使用任何特殊符号,而不能使用字母。

4 个答案:

答案 0 :(得分:4)

运算符重载仅限于现有的C ++运算符集。是运算符超载,而不是创建。您不能创建诸如@之类的新运算符,也不能将诸如'之类的非运算符转化为运算符。

  

我可以在C ++中创建仅对特定类的对象起作用的新运算符吗?

您不能使用 new 运算符。您只能重新利用现有的。

  

...然后用#define更改预处理器处理文本的方式...

您可能不应该这样做。远离预处理器。这是不得已的工具。

答案 1 :(得分:3)

您不能创建C ++标准中不存在的运算符。它们不会成为语法的一部分,并且会导致语法错误。

因此,运算符的可能性与语言语法和语法授权的内容相关(请参阅@afenster答案以获取指向列表的链接)。

顺便说一句,此运算符问题在其他语言(例如Python)中也适用,委员会需要确定添加新的运算符(例如用于矩阵乘法的@)是否适合该语言。许多运算符是从数学表达式派生的,因此添加没有此数学背景的新运算符是没有意义的(例如,*()除外)

答案 2 :(得分:3)

您可以重载的运算符列表为here。不幸的是(或幸运的是)您不能将任何其他字符用作运算符。这样做的最基本原因是,运算符重载不会并且一定不能更改代码语法解析的逻辑(例如什么是运算符,什么不是运算符,什么是运算符优先级等)。

答案 3 :(得分:0)

您只能重载现有的运算符。

您可以伪造一点。

namespace my_operator {
  struct transpose_t {};
  constexpr tranpose_t transpose{};

  template<class Matrix>
  Matrix operator^( Matrix lhs, tranpose_t ) {
    lhs.Transpose();
    return lhs;
  }
}

鉴于此,并且有了具有自动转置的.Transpose()方法的矩阵类型,我们得到:

using my_operator::transpose;

MATRIX m = {/* whatever */};
MATRIX tm = m^transpose;

tm将是m的转置。