1. 断言(assert)的使用时机与if语句的差别:assert主要用在调用和测试阶段,用来发现潜在的bug,发行版本中应该完全去除。if是正常的逻辑分支,用来预防错误的发生,发行版本中,所有的assert失败情况都要(或用if)加以处理,换句话说,assert是专为调试而写的特殊if语句,它可直接指出出错所在地方并终止程序,无需用户写这些代码。
2. 断言不假时,将调用asertImpl函数,此函数接受三个参数,断言所在的行号,文件名及表达式字符串。
3. 检测内存泄漏的一种方法:重载new,delete方法,使它加入两个参数,内存分配和释放操作所在的行号及文件名(分别由宏__LINE__和__FILE__得到),并在delete和new操作中打印出相应信息:**文件第**行分配了**内存。
4. 防止内存泄漏的其它方法有:智能指针,养成好习惯,代码走查,检测工具,虚析构函数的使用等。好的编程习惯包括:数组使用之前,一定要初始化、分配内存一定自己释放、注重编译器的警告信息、类型转换尽量规范等。
5. string可以用char * 初始化,也可以将string中的内容取出为char *,用str.data()可以取出为const char *类型的内容,用str.c_str()可以取出为C风格的串,即带'/0'结尾的串。
6. 虽然通常将string当成一个类,但其它并非如此,它是模板特化而来的:
typedef basic_string<char> string;
basic_string的声明为:
template <class charT, class traits=char_traits<charT>, class allocator=allocator<charT>> class basic_string;
其中第二三个参数有默认值,分别表示(比较等)特性和内存分配方式,若想生成一个不区分大小写的string类,只需要从char_traits派生出应具有的特征,然后typedef basic_string<char, ichar_traits> istring即可。其中ichar_traits为派出的特征类。
7. istream, ostream, iostream与string一样,都是由模板派生而来的特化类。
8. 为什么不用C的I/o库封闭成类,而引用输入输出流?
(1)printf等的可变参数特性,需要一个专门的运行时解释程序,占空间;
(2)运行时解释程序运行会影响速度;
(3)printf不会进行参数类型和个数等的检查,易引发错误;
(4)printf扩展性不好,只支持几种基本数据类型。
9. 有三种方式可以按行读取:成员函数get()、成员函数getline()及非成员函数getline()。getline与get的区别在于,get不会读取换行符,而getline会读取并丢掉之,方便连续读取。
10. 输入输出字符串流可以输出到一个窗口变量中,通过ostringstream和istringstream。如把文件全读入到一个字符串中,则可不用考虑换行。