2011-08-12 56 views
0

下面是一段代码:拷贝构造函数和赋值操作符

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() 

我的问题是为什么拷贝构造函数的最后一组被称为?

+1

我们可以看到代码多数民众赞成在实际创建这个输出? – MGZero

+0

我已经上传了实际的代码 – Atishay

+0

哦,它是。错过了滚动条大声笑 – MGZero

回答

5

因为Checkers的赋值运算符按照惯例返回值而不是引用。

+0

+1,是的。而已。 –

3
Checkers operator=(const Checkers& c) 

应该

Checkers& operator=(const Checkers& c) 
相关问题