2017-06-08 28 views
1

私はC++を習得しており、メンバ変数を宣言することなくコンストラクタが初期化されるこのコードを知りました。また、オブジェクトはパラメータなしで作成されます。代わりにデフォルトのコンストラクタを呼び出すのではないでしょうか?クラスのオブジェクトは、メンバ変数を定義せずに初期化されます

また、このクラスが継承されている場合、派生クラスはxとyにアクセスできますか?

//プログラム例

#include <iostream> 
#include <string> 

class game 
{ 
public: 
    game(int x = 0, int y = 100); // Do they get defined as members? 
    int z; 
}; 

game::game(int x, int y) : z(x) 
{ 
    std::cout << x; 
} 

int main() 
{ 
    game g; // passed w/o parameters. 
    return 0; 
} 
+0

彼らは、派生クラスから呼び出された基底クラスのコンストラクタで、xとyにアクセスすることができます。 –

+1

コンストラクタのすべての引数にデフォルトの引数を与えるので、引数を指定せずに呼び出すことができるため、コンストラクタはデフォルトのコンストラクタになります。 –

+1

そして、どんな関数でも、引数はローカル変数として振る舞い、関数が返ったらスコープから外れます。それはコンストラクタにとっても同様です。コンストラクタの引数もコンストラクタのローカル変数も、そのクラスのメンバ変数にはなりません。 –

答えて

2

また、オブジェクトは、パラメータを指定せずに作成されます。代わりにデフォルトのコンストラクタを呼び出すのではないでしょうか?

次のようにあなたのコンストラクタを宣言します。

game(int x = 0, int y = 100); 

と実装:

game::game(int x, int y) : z(x) 
{ 
    std::cout << x; 
} 

あなたが呼び出すとき、コンストラクタのデフォルト引数を指定しているので:

game g; 

caと同じですlling:

game g {0, 100}; 

デフォルトの引数はコンストラクタに提供されているためです。

game(int x = 0, int y = 100); //メンバーはメンバーとして定義されますか。

クラスのメンバーに値を設定しない限り、それらはメンバーとして定義されません。 xyは両方ともコンストラクタの終わりにスコープから外れます。

また、このクラスが継承される場合、派生クラスはxとyにアクセスできますか?次のようにあなたが見ることができる直接

ない、:

class Derived : public game 
{ 
public: 
    Derived(); 
}; 

Derived::Derived() : game(100, 100) //Or whatever arguments 
{ 
    //... 
} 
+1

ありがとうございます。分かりました。 – Cleverboy

関連する問題