20. 流运算符为什么不能通过类的成员函数重载?一般怎么解决?
答:因为通过类的成员函数重载必须运算符的第一个是自己,而对流运算的重载要求第一
个参数是流对象。一般通过友元来解决。
21. 赋值运算符和拷贝构造函数的区别与联系?
答:相同点:都是将一个对象 copy 到另一个中去。
不同点:拷贝构造函数涉及到要新建立一个对象。
22. 在哪种情况下要调用该类的析构函数?
答:对象生命周期结束时。
23. 对象间是怎样实现数据共享的?
答:通过类的静态成员变量来实现的。静态成员变量占有自己独立的空间不为某个对象所
私有。
24. 友元关系有什么特性?
答:单向的,非传递的,不能继承的。
25. 对对象成员进行初始化的次序是什么?
答:它的次序完全不受它们在初始化列表中次序的影响,只有成员对象在类中声明的次序
来决定的。
26. sizeof 和 strlen 的区别有哪些?
答:(1) sizeof 是一个操作符,strlen 是库函数;
(2) sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为'\0'的字符
串做参数;
(3) 编译器在编译的时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算
出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度;
(4) 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
27. typedef 和 define 有什么区别?
答:(1) 用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要
用来定义常量,以及书写复杂、使用频繁的宏;
(2) 执行时间不同:typedef 是编译过程的一部分,有类型检查的功能。define 是宏定义,
是预编译的部分,其发生在编译之前,只是简单地进行字符串的替换,不进行类型的检查;
(3) 作用域不用:typedef 有作用域限定。define 不受作用域约束,只要是在 define 声明
后的引用都是正确的;
(4) 对指针的操作不同:typedef 和 define 定义的指针有很大的区别。
28. const char *p;与 char * const p;的区别
答:如果 const 位于星号的左侧,则 const 就是用来修饰指针所指向的变量,即指针指向常
量;如果 const 位于星号的右侧,const 就是修饰指针本身,即指针本身是常量。