2016-11-18 38 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的內容才能更好地理解它。