2016-11-18 11 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])以外の関数の終わりを流出させると、未定義の振る舞いになります。

プログラムの結果はで、定義されていない動作が発生する可能性があります。

第2に、値を返すコンストラクタ関数ですか?

私はあなたがこの行のものだと思う:

return Distance(feet, inches); 

feetinchesから構成されてDistanceprvalueを返す並びます。その値はコピー・エリジョンに適格でなければならず、C++のコピーには含まれていないことが保証されています。17

第3に、値を返す方法変数ではないということです。変数?

[stmt.return]言ったから、重点は私のものです:

return文の式expr・オア・ブレース-INIT-リストは、そのオペランドと呼ばれています。オペランドのないreturn文は、戻り値の型がcv void、コンストラクタ([class.ctor])、またはデストラクタ([class.dtor])の関数でのみ使用されます。void型のオペランドを持つreturn文は、戻り値の型がcv voidの関数でのみ使用されます。他のオペランドとのreturn文は、戻り値の型がcv voidでない関数でのみ使用されます。 returnステートメントは、オペランドからコピー初期化([dcl.init])によって(明示的または暗黙的な)関数呼び出しのglvalue結果オブジェクトまたはprvalue結果オブジェクトを初期化します。 [注意:return文は、prvalueでないか、またはその型が関数の戻り型と異なる場合、オペランドのコピーまたは移動を実行するコンストラクタの呼び出しを伴います。自動記憶期間変数([class.copy])が返された場合、returnステートメントに関連付けられたコピー操作が省略されたり、移動操作に変換されたりする可能性があります。 - エンドノート] [例:

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

/何でも起こります/悪魔があなたの鼻から飛び出すことができます/ – Qix

0
  1. return Distance(feet, inches);-D1ような式の値に影響するので、あなたがD1 = -D2を行う場合は、returnを使用すると、違いを生むだろう。

  2. コンストラクタ関数は何も返しません。これは、オブジェクトが作成されたときに実行されるコードを含んでいます。

  3. ある意味では、戻り値は不可視変数のようなものです。しかし、アセンブリ、コンパイラ、およびCPUについてよく理解するためには、たくさんのことを読む必要があります。

関連する問題