Basic C++ knowledges

1. 关于成员变量初始化顺序,几个有依赖关系的成员变量要初始化,让写出构造函数。

在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序

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),运行时可以通过LoadLibraryLoadLibraryEx函数载入DLLDLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了


20。 unsigned死循环

   unsigned char ucCmdNum;
      for(ucCmdNum=0; ucCmdNum <= 256; ucCmdNum++)
   {......}

21. 2个栈实现1个队列:
    入队:push到A栈.
    出对:从B栈pop. 如B为空,将A全pop并push到B里面,再popB栈.

22. 1. 耗时的操作使用线程,提高应用程序响应(有界面的)
    2. 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
    3. CPU系统中,使用线程提高CPU利用率
     4. 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
   其他情况都使用单线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值