这是一段代码:
class GameBoard
{
public:
GameBoard() { cout<<"Gameboard()\n"; }
GameBoard(const GameBoard&)
{
cout<<"GameBoard(const GameBoard&)\n";
}
GameBoard& operator=(const GameBoard&)
{
cout<<"GameBoard& operator=(const GameBoard&)\n";
return *this;
}
~GameBoard() { cout<<"~GameBoard()\n";};
};
class Game
{
GameBoard gb;
public:
Game(){ cout<<"Game()\n"; }
Game(const Game&g):gb(g.gb)
{
cout<<"Game(const Game&g)\n";
}
Game(int) {cout<<"Game(int)\n"; }
Game& operator=(const Game& g)
{
gb=g.gb;
cout<<"Game::operator=()\n";
return *this;
}
class Other
{
public:
Other(){cout<<"Game::Other()\n";}
};
operator Other() const
{
cout<<"Game::Operator Other()\n";
return Other();
}
~Game() {cout<<"~Game()\n";}
};
class Chess: public Game {};
void f(Game::Other) {}
class Checkers : public Game
{
public:
Checkers() {cout<<"Checkers()\n";}
Checkers(const Checkers& c) : Game(c)
{
cout<<"Checkers(const Checkers& c)\n";
}
Checkers operator=(const Checkers& c)
{
Game::operator=(c);
cout<<"Checkers operator=(const Checkers& c)\n";
return *this;
}
};
int main()
{
Chess d1;
Chess d2(d1);
d1=d2;
f(d1);
Game::Other go;
Checkers c1,c2(c1);
c1=c2;
}
这是输出
Gameboard() //Constructing d1
Game()
GameBoard(const GameBoard&)
Game(const Game&g) //d2(d1)
GameBoard& operator=(const GameBoard&)
Game::operator=() //d1=d2
Game::Operator Other() //f(d1)
Game::Other()
Game::Other() //go
Gameboard() //c1
Game()
Checkers()
GameBoard(const GameBoard&) //c2(c1)
Game(const Game&g)
Checkers(const Checkers& c)
GameBoard& operator=(const GameBoard&) //c1=c2
Game::operator=()
Checkers operator=(const Checkers& c)
GameBoard(const GameBoard&) ?
Game(const Game&g) ?
Checkers(const Checkers& c) ?
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()
~Game()
~GameBoard()
我的问题是为什么要调用最后一组拷贝构造函数?
答案 0 :(得分:5)
因为Checkers
的赋值运算符按惯例返回值而不是引用。
答案 1 :(得分:3)
Checkers operator=(const Checkers& c)
应该是
Checkers& operator=(const Checkers& c)