2016-11-18 40 views
0
#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);我已经在程序中发表了这个声明作为评论,但仍然输出是真实的。但如果我运行程序而不使它评论该程序也可以正常工作,而不是在这个语句使用的目的是什么?其次,构造函数是否返回值?第三,它是如何返回值我的意思是它不是一个变量我总是听说我们可以从变量返回值?- 在C++中减一元运算符重载

+0

'-D1.displayDistance()'显示什么? – danielunderwood

+0

它是D1.displayDistance();不是 -。 –

+0

'operator -'不应该修改变量,所以你不应该像这样使用'-D1;',它应该什么也不做。你应该像这样使用它:'D1 = -D1;' – smead

回答

0

,如果我不做评论它的程序运行程序也工作比什么目的罚款此语句是使用

[stmt.return]

流走到底构造函数,析构函数或带有cv void返回类型的函数相当于没有操作数的返回值。否则,从main([basic.start.main])以外的函数结束流动会导致未定义的行为。

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

其次,它是构造函数返回值?

我想你的意思是这条线:

return Distance(feet, inches); 

那行返回的是从feetinches构建Distance一个prvalue。该值应该有资格复制省音,并保证将在副本从C++ 17

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

从说[stmt.return],强调的是我的:

的EXPR - 或 - 支撑 - 初始化列表return语句被称为它的操作数。没有操作数的return语句只能用于返回类型为cv void的函数,构造函数([class.ctor])或析构函数([class.dtor])。带有void类型操作数的return语句只能用于返回类型为cv void的函数。任何其他操作数的返回语句只能用于返回类型不是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); 
} 
+0

s /任何事情都可能发生/恶魔可以飞出你的鼻子/ – Qix

0
  1. return Distance(feet, inches);影响像-D1表达式的值,所以如果你做D1 = -D2,然后使用return会有所作为。

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

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