容易忽视的地方记录如下:
1.流提取操作符>>与scanf函数并不等价,当遇到字符变量时它会忽略“空白字符”, 即空格、TAB键和回车键。此时可以使用get操作函数。getline函数与gets相似。ignore函数用于忽略n个字符。当使用函数成员实现格式化时,如cout.width(5),效果虽与格式控制符setw(5)相同,但它会将上述设定保持到重新设定或程序结束。endl与\n不完全相同。可通过cout<<setw(5)<<'\n'<<setw(5)<<endl;证明。
2.使用setprecision(n)可控制输出流显示浮点数的数字个数。C++默认的流输出数值有效位是6。
如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。setiosflags(ios::fixed)是用定点方式表示实数。
如果与setiosnags(ios::scientific)合用, 可以控制指数表示法的小数位数。setiosflags(ios::scientific)是用指数方式表示实数。
关于setprecision的一个重要原则为:有效位不足时其不会补0,同样小数点后0不会显示。这是其与C语言中相关设置的本质区别。printf("%f", 52.3);输出为52.300000,而cout<<52.3;的输出为52.3。(虽然默认数字个数为6,但小数点后面的0自动省略!!)
3.对象产生时必然会有构造函数执行。拷贝构造函数的参数一定是一个引用。如果它的形参不是引用,而是一个普通的局部对象,当将对象传递给拷贝构造时,又将调用拷贝构造函数自身。这个过程将一起进行下去。拷贝构造函数执行的时机,(1)用对象初始化另一个对象(2)用实参初始化形参(3)函数返回一个对象时。return string(s1+s2);的效率要高于string temp(s1+s2); return temp;。
4.operator=重载时的原则。(1)检查是否为自赋值(2)释放原空间(3)申请新空间(4)赋值操作。后置用哑元区分。operator++(int)。友元多用于重载流插入流提取。注在VC6.0中,相关的重载函数必须要类声明中定义才会正确运行。
5.基数的构造函数必须在初始化列表中调用才会正确执行。(在子类的构造函数中调用基数的构造函数时不会用子类对象地址为this指针赋值,以免与包含的对象成员相冲突)const成员必须在初始化列表中初始化。对象成员在初始化列表中初始化,效率要高,但在构造函数中时会使用赋值操作符。
6重定义(redefine):派生类对基类的成员函数重新定义,即派生类定义了某个函数,该函数的名字与基类中的函数名字一样。可能是重载也可能是覆盖,但无论何种情况,在派生类中,基类中该名字的函数(即其他所有重载版本)都被自动隐藏,包括同名的虚函数。