【问题标题】:Problem in understanding operator overloading理解运算符重载的问题
【发布时间】:2019-01-08 12:48:51
【问题描述】:

我正在阅读 Bjarne Stroustrup 的 TCPPPL,我遇到了以下代码(如下所示)。我有两个问题:

  1. 函数 operator+ 的主体在哪里?我的意思是只有 X 类中的函数声明。

  2. X(int) 行是什么意思?这是以 int 作为参数的构造函数还是其他什么?


 class X {
     public:
     void operator+(int);
     X(int);   
 };

 void operator+(X,X);
 void operator+(X,double);

 void f(X a)
 {
     a+1;    // a.operator+(1)
     1+a;    // ::operator+(X(1),a)
     a+1.0;  // ::operator+(a,1.0)
 }

【问题讨论】:

  • 您显示的代码没有operator+() 的“主体”或X 的构造函数,或X 之后声明的operator+() 的两个版本。 X(int) 声明了 X 的构造函数,它接受 int 作为参数。除非函数在其他地方定义(实现),否则该代码将编译,但链接将失败。
  • @Peter 请不要将答案写入 cmets。
  • 请注意,示例省略实现是很常见的。由于该示例似乎主要是关于重载解决方案,因此实现并不真正相关。同样正如彼得已经提到的,代码编译没有,只有当你尝试链接它会失败

标签: c++ operator-overloading


【解决方案1】:

1) 函数operator+的主体在哪里?我的意思是在 X 类中只有函数的声明。

operator+ 的定义(主体)可以在任何地方。该代码显然不是一个完整的程序(没有main)。因此,定义可能在显示的代码之下,甚至在另一个编译单元中。

2) X(int) 行是什么意思?这是以int为参数的构造函数还是别的什么?

这是X 类的转换构造函数的声明,它接受整数作为参数。

【讨论】:

    【解决方案2】:

    X(int) 行是什么意思?

    X(int) 是接受单个整数参数的构造函数的声明。缺少定义。

    函数operator+的主体在哪里

    无论您在哪里定义它。

    如果没有正确的定义,此代码将无法工作。

    【讨论】:

    • “如果没有定义,此代码将无法工作。” 这取决于您所说的 不会工作 的含义。您可以很好地编译这样的代码(例如,使用g++ -c)。您只是无法运行或链接它。
    • 你说得对,我添加评论是因为 OP,他似乎不太熟练地理解编译和链接之间的这些差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2014-04-14
    • 2010-12-23
    相关资源
    最近更新 更多