繁体   English   中英

复制构造函数和赋值运算符

[英]Copy constructor and assignment operator

这是一段代码:

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;
}

这是 output

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

我的问题是为什么最后一组复制构造函数被调用?

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

Checkers operator=(const Checkers& c)

应该

Checkers& operator=(const Checkers& c)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM