📄 p601继承和编译器默认的函数.txt
字号:
/*本程序对应于thinking in c++ P600页的程序,在于说明
*/
#include <iostream>
using namespace std;
class GameBoard {
public :
GameBoard() { cout << "GameBoard() \n"; } //default constructor
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 {
private:
GameBoard gb; //composition
public:
//default GameBoard constructor called,如果将GameBoard()去掉,则出错:: error C2512: “GameBoard” : 没有合适的默认构造函数可用
Game(){ cout << "Game() \n"; }
//你必须显示通过gb(g.gb)调用GameBoard的拷贝构造函数,不然(即如果去掉: gb( g.gb ) )则默认构造函数被调用,在main()中用Game g1;Game g2(g1)实验。
Game( const Game &g ): gb( g.gb ) { cout << "Game( const Game &g)\n"; }
//default GameBoard constructor called,如果没有默认的构造函数,则出错同上。
Game( int ) { cout << "Game( int )\n";}
//在main()中调用Game g1;Game g2;cout << " 开始拷贝 "<<endl;g2=g1;
//如果去掉gb = g.gb 则对与this->gb来说没有完成赋值工作,还是原值保留不变。
Game & operator = ( const Game & g ){ gb = g.gb; cout << "Game & operator = ( const Game & g )"; return *this;}
class Other {}; //nested class嵌套类,定义这个类的目的是为了说明下面的自定义类型
operator Other() const { //自定义类型转换,定义这个转换的目的是为了说明:自定义转换可以被继承:在
//main()中:Chess d1;f(d1);
cout << "Game::operator Other()\n";
return Other();
}
~Game() { cout << "~Game() \n";}
};
//继承,但是Chess没有自定义的函数,这样做是为了检查编译器会如何反应。在main()中: Chess d1;Chess d2(d1);
// Chess d3;d3 = d2; 会发现一个有趣的现象:在编译器默认拷贝构造函数和默认拷贝赋值函数中,如果该类有子对象(如Game中由类的组合得来的
//的子对象gb,或是由于继承而得来的基类子对象),则拷贝该成员类对象调用的是相同的过程(即调用子对象对应的类的拷贝构造函数或是拷贝赋值函数)。
//类继承
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;
f(d1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -