【问题标题】:C++ creating new operators and overloading the current onesC++ 创建新的运算符并重载当前的运算符
【发布时间】:2019-10-16 04:42:45
【问题描述】:

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

' 甚至是运算符吗?我知道如果它在' ' 之间,你记一个字符,如果你使用" ",你记一个字符串。但是这些运营商是不是?我可以将它们作为单个字符甚至整个字符重载吗?

我能否在 C++ 中创建仅适用于特定类的对象的新运算符?我使用的技巧是重载已知的运算符,如+-^,...然后使用#define,我更改了预处理器处理文本的方式,但最后我仍然会覆盖一个现有的运算符,我不能使用任何特殊符号,而是使用字母。

【问题讨论】:

  • 另外,请注意,当重载运算符时,您可以创造以非预期方式使用类型的可能性。不要对操作重载感到太高兴,除非它确实提高了代码的清晰度。
  • 请参阅here 了解有关运算符重载的完整详细信息。

标签: c++ operator-overloading


【解决方案1】:

运算符重载仅限于现有的 C++ 运算符集。它是运算符重载,而不是创建。你不能把@这样的新运算符变成运算符,也不能把'这样的非运算符字符变成运算符。

我能否在 C++ 中创建仅适用于特定类的对象的新运算符?

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

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

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

【讨论】:

  • 我所说的只对特定类的对象起作用的新运算符的意思就像你提到的@,等等。这是不可能的,因为我猜编译器不知道这意味着什么?
  • 因为它们不是语言语法的一部分,所以编译器将无法解析这些新操作。
【解决方案2】:

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

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

另一方面,这个运算符问题在 Python 等其他语言中也存在,委员会需要决定添加新运算符(如矩阵乘法的@)是否对语言有意义。许多运算符都是从数学表达式派生的,因此添加没有这种数学背景的新运算符是没有意义的(例如*() 除外)

【讨论】:

    【解决方案3】:

    您可以重载的运算符列表是here。不幸的是(或幸运的是),您不能使用任何其他字符作为运算符。最根本的原因是运算符重载不会也绝不能改变你代码的语法解析逻辑(比如什么是运算符什么不是,运算符优先级是什么等)。

    【讨论】:

      【解决方案4】:

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

      你可以假装一点。

      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 的转置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-26
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多