在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。
2. 怎样使一个class不能被实例化
1,构造函数私有化(Singleton) 2,抽象类 (pure virtual function).但2不太好
3. 私有继承和public继承的区别。
私有继承: 只继承实现,不继承实现 has-a
公有继承:继承接口与实现 is-a
4. void *p的问题
不能++ . 因为编译器不知道他所指的size. 可以用来避免显式指针类型转换,如memcpy,参数用不着写(void*)了。
5. 一个32位的数据,怎样找到最左边的一个1?
如果是在最左位,这个数是负数,否则的话,左移一位,看是否变成负数,这是O(n)的算法, 也可以用一个模板去与,并不断改变这个模板
6. STL中container有哪些?
序列容器: vector, list, deque, bitset
关联容器: set, multiset, map, multimap
适配容器:stack, queue, priority_queue
类容器: string, valarray, bitset
扩展容器:hash_set, hash_multiset, hash_map, hash_multimap
7. 一般在什么时候构造函数被声明成private呢?
singleton模式; 阻止某些操作(如阻止拷贝构造)
8. 一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的?
先执行基类的(如果基类当中有虚基类,要先执行虚基类的,其他基类则按照声明派生类时的顺序依次执行),再执行成员对象的,最后执行自己的。
9. Overload, Overwrite, Override 各自的特点和意义
Overload: 函数重载(名字相同,参数不同)
Overwrite:覆盖
Override: 虚函数重载
10. #i nclude <filename.h> 和#i nclude “filename.h” 有什么区别?
#i nclude <filename.h>: 从标准库路径去寻找该文件,对于VC来说,应该还包括VC环境设置选项中的包含目录以及工程属性中指定的目录
#i nclude “filename.h”:先在当前目录查找,如果找不到,按上面那种方式寻找。 #include "../includes/sb.h"
11. 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言的不同。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题
12. C#和C++除了语法上的差别以外,有什么不同的地方?
C++是直接生成可执行代码,而C#是先生成中间代码,等到第一次执行时,才由JIT(Just In Time)生成可执行的机器码。
还有就是(1) c#有垃圾自动回收机制,程序员不用担心对象的回收。(2)c#严禁使用指针,只能处理对象。如果希望使用指针,则仅可在unsafe 程序块中能使用指针。(3)c#只能单继承。(4)必须通过类名访问静态成员。不能像C++中那样,通过对象访问静态成员。(5)在子类中重写父类的虚函数时必须用关键字override,覆盖父类的方法要用关键字new
13. 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。
不为零,不同的对象应该有不同的地址,假设我声明一个A的数组A a[2],如果为零,那么a[0]和a[1]的地址岂不相同了。(大小为1)
14. 有哪几种情况只能用intialization list 而不能用assignment?
当类中含有const、reference 成员变量;基类的构造函数都需要参数;类中含有其他类的成员对象,而该类的构造函数都需要参数。
15. C++是不是类型安全的?
不是。两个不同类型的指针之间可以强制转换。C#是类型安全的。
16. char *p="abcde"; : 字符串常量区,不可写. sizeof(p) == 4
char p[]="abcde"; : 栈里. sizeof(p) == 6
void func(char p[]) : 沦为普通指针 sizeof(p) == 4
17. a = 4; (++a) += (a ++); : a++是语句的最后1条指令. a == 11
(++a) += a; : a在用时才拿到寄存器. a == 10
18. 程序什么时候应该使用线程,什么时候单线程效率高。
19.动态连接库的两种方式?
答:调用一个DLL中的函数有两种方法:
1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了
20。 unsigned死循环
unsigned char ucCmdNum;
for(ucCmdNum=0; ucCmdNum <= 256; ucCmdNum++)
{......}
22. 1. 耗时的操作使用线程,提高应用程序响应(有界面的)
2. 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3. 多CPU系统中,使用线程提高CPU利用率
4. 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。