私はC ++の第14章で考えていることを読んでいます:「自動的に継承されない関数」
class GameBoard {
public:
GameBoard() { cout << "GameBoard()\n"; }
GameBoard(const GameBoard&) {
cout << "GameBoard(const GameBoard&)\n";
}
GameBoard& operator=(const GameBoard&) {
cout << "GameBoard::operator=()\n";
return *this;
}
~GameBoard() { cout << "~GameBoard()\n"; }
};
class Game {
GameBoard gb; // Composition
public:
// Default GameBoard constructor called:
Game() { cout << "Game()\n"; }
// You must explicitly call the GameBoard
// copy-constructor or the default constructor
// is automatically called instead:
Game(const Game& g) : gb(g.gb) {
//Game(const Game& g) {
cout << "Game(const Game&)\n";
}
Game(int) { cout << "Game(int)\n"; }
Game& operator=(const Game& g) {
// You must explicitly call the GameBoard
// assignment operator or no assignment at
// all happens for gb!
gb = g.gb;
cout << "Game::operator=()\n";
return *this;
}
class Other {}; // Nested class
// Automatic type conversion:
operator Other() const {
cout << "Game::operator Other()\n";
return Other();
}
~Game() { cout << "~Game()\n"; }
};
Game
上記のコードでは、クラスのコピー コンストラクターと代入コンストラクターに混乱しています。
// You must explicitly call the GameBoard
// copy-constructor or the default constructor
// is automatically called instead:
Game(const Game& g) : gb(g.gb) {
//Game(const Game& g) {
cout << "Game(const Game&)\n";
}
Game& operator=(const Game& g) {
// You must explicitly call the GameBoard
// assignment operator or no assignment at
// all happens for gb!
gb = g.gb;
cout << "Game::operator=()\n";
return *this;
}
作成者は次のようにコメントしています。「コピー コンストラクターを明示的に呼び出す必要があります。そうしないと、GameBoard
代わりにデフォルト コンストラクターが自動的に呼び出されます。コピー コンストラクターを明示的に呼び出さないとGameBoard
、デフォルト コンストラクターが呼び出されるのはなぜですか?」
また、代入コンストラクターについては、代入演算子を明示的に呼び出さないと、代入は行われません。GameBoard
なんで?