书名:C++探秘:68讲贯通C++
英文名:Exploring C++ : The Programmer’s Introduction to C++
作者:[美] Ray Lischner(里斯纳)
译者:刘晓娜 林健 石小兵 李杰
出版社:人民邮电出版社
版本/版次:2011年1月第1版,2011年1月北京第1次印刷
第27讲 自定义类型
构造函数的初始化列表,形如下所示:
rational(int num, int den) : numerator(num), denominator(den) {…}
初始化列表时可选的,如果没有它,则数据成员是未初始化的。(?那么默认构造函数呢,如果一个类包含多个数据成员,使用这种语法是否太累?)
第28讲 重载操作符
对于C++预定义好的类型,我们无法对其重载操作符。换句话说,要出现操作符重载,操作数中必须至少包含一个自定义的类型。重载操作符的一个技巧是,使用相关的一个已重载好的操作符来实现重载。例如:
bool operator==(T a, T b) {…} bool operator!=( T a, T b) {return not (a == b);}
考虑到多一层函数调用的性能开销,可以适时使用inline关键字,例如:
bool operator==(T a, T b) {…} bool inline operator!=( T a, T b) {return not (a == b);}
对于琐碎的函数也可以使用inline关键字。inline提示编译器在函数调用点展开该函数。
第29讲 自定义IO操作符
对于输入操作符,即提取器(因为它从流中提取数据),其第一个参数为std::istream&。它必须是非常量引用,以便在函数中修改流对象。第二个参数因为要存储输入值,所以也必须是非常量引用。返回值通常就是第一个参数,类型为std::istream&,以便在同一表达式中连接多个输入操作符(就像:std::cin >> x >> y 之类的)。
函数体完成输入流的读取、解析和翻译工作。每个流用一个状态掩码跟踪错误,下表列出了可用的状态标志。
标志 | 描述 |
badbit | 不可恢复的错误 |
failbit | 非法输入或输出 |
eofbit | 文件尾 |
goodbit | 无错 |
第一个参数(std::istream&类型)的成员函数unget()使输入操作符回退多读入的字符,这关系到程序的后续执行。整数操作符与此类似:尽量多读入字符直到读到的字符不属于该整数为止,然后回退最后一个字符。e.g:输入操作符例子,其中rational为自定义的有理数类型,包含分子numerator(int型)、分母denominator(int型),有理数是形如4/3、1/2的数。
#include <ios> // declares failbit, etc. #include <istream> // declares std::istream and the necessary >> operators std::istream& operator>>(std::istream& in, rational& rat) { int n(0), d(0); char sep('