复制构造函数和operator=的一点注意事项

来源:互联网 发布:java程序员主要做什么 编辑:程序博客网 时间:2024/06/05 07:19
 
 
class GameBoard{public:        GameBoard()    {       std::cout << "GameBoard()" << std::endl;    }    GameBoard(const GameBoard&)    {       std::cout << "GameBoard(const GameBoard&)" << std::endl;    }    GameBoard& operator=(const GameBoard& other)    {       std::cout<< "GameBoard& operator=()" << std::endl;       return *this;    }    ~GameBoard()    {       std::cout << "~GameBoard" << std::endl;    }};class Game{public:    Game()    {      std::cout << "Game()" << std::endl;    }    ~Game()    {      std::cout << "~Game()" << std::endl;    }    //显示调用子对象复制构造函数    Game(const Game& other):gb(other.gb)    {       std::cout << "Game(const Game& other)" << std::endl;    }    Game& operator=(const Game& other)    {       gb = other.gb; //显示调用子对象赋值函数       std::cout << "Game& operator=()" << std::endl;       return *this;    }private:    GameBoard gb;};class Checkers : public Game{public:    Checkers()    {       std::cout << "Checkers()" << std::endl;    }    ~Checkers()    {       std::cout << "~Checkers()" << std::endl;    }    Checkers(const Checkers& other):Game(other) //显示调用基类复制构造函数    {       std::cout << "Checkers(const Checkers& other)" << std::endl;    }    Checkers& operator=(const Checkers& other)    {        Game::operator=(other); //显示调用基类赋值函数       std::cout << "Checkers& operator=()" << std::endl;    }};
 

总结:

1.复制构造函数默认调用基类的默认构造函数,不会自动调用基类复制构造函数。当派生类写拷贝构造函数时,要显示调用基类的拷贝构造函数,如下:

Derived(const Derived& d):Base(d)

{

}

2.operator= 不会自动调用基类的operator=,当为派生类写赋值操作符,要显示调用基类版本,如下:

Derived& operator=(const Derived& d)

{

    Base::operator=(d);

}

 

 


 

1 0
原创粉丝点击