2016-11-07 2 views
-1

this questionで報告されたコードを参照して、私は何が起こっているのかを理解するために以下の質問があります。const型を含むいくつかのC++コードを理解する&

class Integer32 { 
public: 
    Integer32() { 
     this->setData(0); 
    } 
    Integer32(const Integer32& x) { 
     this->setData(x.getData()); 
    } 
    Integer32(int data) { 
     this->data = data; 
    } 
    Integer32& operator=(const Integer32& x) { 
     if (this != &x) { 
      this->setData(x.getData()); 
     } 
     return *this; 
    } 
    Integer32& operator=(const int& x) { 
     this->setData(x); 
     return *this; 
    } 
    Integer32 operator+(const Integer32& x) const { 
     return Integer32(this->getData() + x.getData()); 
    } 
    void setData(int data) { 
     this->data = data; 
    } 
    int getData() const { 
     return data; 
    } 
private: 
    int data; 
}; 

int main(int argc, char** argv) { 
    Integer32 a, b, c; 
    a = 7; 
    b = 9; 
    a = b; 
    c = a + b; 
    return 0; 
} 
  1. a, b右、非constのInteger32ですか?
  2. b = 9はオペレータオーバーロード=を呼び出しますが、リテラルはどうなりますか9?私の演算子はconst int&が必要ですが、私はリテラル定数を渡しています。
  3. a = bは、bconst Integer32&であることが必要であり、ここでのキャストはInteger32からconst Integer32&
  4. c = a + bは、両方とも定数にキャストされていますか?
+0

デバッガを使用できませんでしたか?キャスト/コンストラクタまたは代入演算子が実行されると、それぞれのメンバ関数が呼び出されます。 –

+0

これは典型的な "自分自身をデバッガにする"という質問ではありません。むしろ、この特定の例の言語はどのように機能しますか? – zoska

答えて

5

a、bはconst const 32でないのですか?

はい。 (私はどこにでもconstは表示されません)

b = 9は私の演算子overload =を呼びます。リテラル9はどうなりますか?私の 演算子はconst整数&が必要ですが、リテラル定数を渡しています。

9は、一時的なタイプのintです。参照がconstの場合を除き、一時的なものは参照として渡すことはできません。この場合、それは本当であり、一時的な寿命は延長され、Integer32& operator=(const int& x)を許します。

= bは構文Integer32 & constのようにBを必要とし、鋳造がここに構文Integer32 &をCONSTする構文Integer32から を行っているのですか?

はい。暗黙のキャストはコンパイラによって行われます。

c = a + b、両方ともa、bは定数にキャストされていますか?

同じ質問です。最初にInteger32 operator+(const Integer32& x)は、オペランドabで終了します。 (bは暗黙的にconst Integer32&に変換されます)。Integer32& operator=(const Integer32& x)はオペランドcで行われ、式a.operator+(b)の結果はInteger32となります。

+0

「9」はprvalueです。組み込み型のprvaluesへの参照をバインドすると、一時的なものが作成され、コピー初期化されます。 –

+0

「はい」に関しては、これは直接参照バインディングであることに注意してください。参照型へのキャストは非参照型とはまったく異なります。これは、OPがハングアップしている可能性があります –

+0

私はconst参照のみを意味しませんでした。例えば、int && c = 9; ' –

関連する問題