2016-06-26 20 views
4

このコードを読んだところ、使用されている初期化の種類や想定される動作を思い出すことができません。
Point p=(3,2);のみPoint p = (3, 2);が呼び出さないので期待x=3 y=2初期化の種類を特定できません

class Point{ 
public: 
    Point(int x=5,int y=5):a(x),b(y){}; 
    void printOut()const{ 
     cout<<"x= "<<a<<"y= "<<b<<endl;} 
private: 
    int a,b; 
}; 

void main(){ 
    Point p=(3,2); 
} 
+1

コンパイラの警告を利用してください。 GCCは私に警告を出します:カンマ演算子の左オペランドは効果がありません。カンマ演算子を検索して質問に答えるには十分です。 – chris

答えて

4

とは対照的に、プリントアウトx=2 y=5ようなものを示すように、コンストラクタへの引数として後者の値(この場合は2)を通過させるように思われます2つの引数を持つコンストラクタですが、1つの引数である2を呼び出します。それはカンマ演算子のためです。これは基本的に最初の式(3)の結果をスローし、最後のもの(2)を返します。

したがって、コンストラクタは1つの引数を渡して呼び出されます。この場合は2で、デフォルトの引数の5が使用されます。

あなたは2つの引数を持つコンストラクタを呼び出したい場合、あなたはいくつかの選択肢があります。

  • Point p(3, 2);
  • Point p = Point(3, 2);
  • Point p = { 3, 2 };(C++ 11)
  • Point p{ 3, 2 };(C++ 11 )
1

Point p = (3,2)は、に相当します。であり、これはPoint p = Point(2)と同じであり、したがって観察された挙動である。 C++でコンマ演算子を読む。

関連する問題