- 减去c ++中的一元运算符重载

时间:2016-11-18 03:50:18

标签: c++

#include <iostream>
#include<conio.h>
using namespace std;

class Distance {
   private:
      int feet;             // 0 to infinite
      int inches;           // 0 to 12
   public:
   // required constructors
      Distance(){
        feet = 0;
        inches = 0;
     }
     Distance(int f, int i){
        feet = f;
        inches = i;
     }
     // method to display distance
     void displayDistance() {
         cout << "F: " << feet << " I:" << inches <<endl;
     }
     // overloaded minus (-) operator
     Distance operator- () {
        feet = -feet;
        inches = -inches;
       // return Distance(feet, inches);
     }
};

int main() {
   Distance D1(11, 10), D2(-5, 11);

   -D1;                     // apply negation
   D1.displayDistance();    // display D1

   -D2;                     // apply negation
    D2.displayDistance();    // display D2

   return 0;
}

我是初学者,学习C ++重载操作符功能。这段代码实际上工作得很好但是在一步中我对// return Distance(feet, inches);感到困惑。我已将此语句作为程序中的注释但仍然输出为真。但如果我运行程序而不进行评论,程序也可以正常使用此语句的目的是什么?第二,它是构造函数返回值吗?第三,它是如何返回值我的意思是它不是变量我总是听说我们可以从变量返回值?

2 个答案:

答案 0 :(得分:0)

  1. return Distance(feet, inches);会影响-D1等表达式的值,因此如果您执行D1 = -D2,那么使用return会产生影响。

  2. 构造函数不返回任何内容。它只包含创建对象时运行的代码。

  3. 在某种意义上,返回值就像一个不可见的变量。但是,您需要阅读很多有关汇编,编译器和cpu的内容才能更好地理解它。

答案 1 :(得分:0)

  

如果我在没有发表评论的情况下运行程序,那么程序也可以正常运行

来自[stmt.return]

  

在构造函数,析构函数或具有cv void返回类型的函数的末尾流动,相当于没有操作数的返回。否则,流出除main([basic.start.main])以外的函数的末尾会导致未定义的行为。

您的程序产生未定义的行为,任何事情都可能发生。

  

第二,是构造函数返回值吗?

我认为你的意思是这句话:

return Distance(feet, inches);

该行返回由prvalueDistance构建的feet inches。该值应该有资格复制 - 删除,并保证在C ++ 17的副本中被删除

  

第三,它是如何返回值我的意思是它不是变量我总是听说我们可以从变量返回值?

从上述[stmt.return]来看,重点是我的:

  

return语句的expr-or-braced-init-list称为其操作数。不带操作数的return语句只能用于返回类型为cv void的函数,构造函数([class.ctor])或析构函数([class.dtor])。具有void类型的操作数的return语句只能在返回类型为cv void的函数中使用。带有任何其他操作数的return语句只能用于返回类型不是cv void的函数中; return语句通过copy-initialization([dcl.init])从操作数初始化(显式或隐式)函数调用的glvalue结果或prvalue结果对象。 [注意:如果操作数不是prvalue或者其类型与函数的返回类型不同,则返回语句可能涉及调用构造函数以执行操作数的复制或移动。如果返回自动存储持续时间变量([class.copy]),则可以省略与返回语句相关联的复制操作或将其转换为移动操作。 - 尾注] [例子:

 std::pair<std::string,int> f(const char* p, int x) {
     return {p,x};
 }

return语句应采用以下形式:

return; // for void and constructor, destructor

return expression-or-braced-init-list;

无论如何,我认为你的减号运算符应如下所示:

 Distance operator- () {
    return Distance(-feet, -inches);
 }