32. 如何定义和实现一个类的成员函数为回调函数?
答:所谓的回调函数,就是预先在系统中对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。
定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别
33. 虚函数是怎么实现的? 答:简单说来使用了虚函数表.
34. 抽象类不会产生实例,所以不需要有构造函数。 错
35. 从一个模板类可以派生新的模板类,也可以派生非模板类。 对
36. main 函数执行以前,还会执行什么代码?
答案:全局对象的构造函数会在main 函数之前执行。
37. main 主函数执行完毕后,是否可能会再执行一段代码,给出说明?
答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行fn1, fn2, fn3, fn4 void main( void ) {
String str(\_onexit( fn1 ); _onexit( fn2 ); _onexit( fn3 );
_onexit( fn4 );
printf( \}
int fn1() {
printf( \return 0; }
int fn2()
{
printf( \return 0; }
int fn3() {
printf( \return 0; }
int fn4()
{
printf( \return 0; }
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed
in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.
37. 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。(Autodesk) 答案:肯定不是零。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]?了。
38. delete与 delete []区别:
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。
199. 子类析构时要调用父类的析构函数吗? 会调用,析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了
42. 一个类的构造函数和析构函数什么时候被调用,是否需要手工调用?
答:构造函数在创建类对象的时候被自动调用,析构函数在类对象生命期结束时,由系统自动调用。
43. 何时需要预编译:
总是使用不经常改动的大型代码体。 程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
44. 多态的作用? 主要是两个:
1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用
45. 虚拟函数与普通成员函数的区别?内联函数和构造函数能否为虚拟函数?
答案:区别:虚拟函数有virtual关键字,有虚拟指针和虚函数表,虚拟指针就是虚拟函数的接口,而普通成员函数没有。内联函数和构造函数不能为虚拟函数。
46. 构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?
答案:构造函数的调用顺序:基类构造函数—对象成员构造函数—派生类构造函数;析构函
数的调用顺序与构造函数相反。析构函数虚拟是为了防止析构不彻底,造成内存的泄漏。
47. .C++中类型为private的成员变量可以由哪些函数访问? 只可以由本类中的成员函数和友员函数访问
49. 类中成员变量怎么进行初始化?
可以通过构造函数的初始化列表或构造函数的函数体实现。
52. 描述实时系统的基本特性
53. 答 、在特定时间内完成特定的任务,实时性与可靠性。
55. 堆栈溢出一般是由什么原因导致的? 答 、没有回收垃圾资源
56. 什么函数不能声明为虚函数? 答 构造函数(constructor)
58. .不能做switch()的参数类型是: 答 、switch的参数不能为实型。
59. 如何引用一个已经定义过的全局变量?
答 、可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错
60. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? 答 :C用宏定义,C++用inline
61. C++是不是类型安全的?
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)
64. C++函数中值的传递方式
有三种方式:值传递、指针传递、引用传递
66. extern“C”有什么作用?
extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “C”后,C++就能直接调用C函数了。extern “C”主要使用正规DLL函数的引用和导出和在C++包含C函数或C头文件时使用,使用时在前面加上extern “C” 关键字即可。
123. 在C++程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”? 答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字
与C 语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。
67. 用什么函数开启新进程、线程: 线程:CreateThread/AfxBeginThread等 进程:CreateProcess等
68. SendMessage和PostMessage有什么区别:
SendMessage是阻塞的,等消息被处理后,代码才能走到SendMessage的下一行。 PostMessage是非阻塞的,不管消息是否已被处理,代码马上走到PostMessage的下一行。
69. CMemoryState主要功能是什么
答案:查看内存使用情况,解决内存泄露问题。
71. 处理器标识#error的目的是什么?
答:编译时输出一条错误信息,并中止继续编译。
73. 在定义一个宏的时候要注意什么?
定义部分的每个形参和整个表达式都必须用括号括起来,以避免不可预料的错误发生
74. 数组在做函数实参的时候会转变为什么类型? 答:数组在做实参时会变成指针类型。
75. 系统会自动打开和关闭的3个标准的文件是? (1) 标准输入----键盘---stdin (2) 标准输出----显示器---stdout
(3) 标准出错输出----显示器---stderr
76. 在Win32下 char, int, float, double各占多少位? (1) char占用8位 (2) int 占用32位 (3) float 占用32位 (4) double 占用64位
78. 说明define和const在语法和含义上有什么不同?
(1) define是C语法中定义符号变量的方法,符号常量只是用来表达一个值,在编译阶段符号就被值替换了,它没有类型;
(2) const是C++语法中定义常变量的方法,常变量具有变量特性,它具有类型,内存中存在以它命名的存储单元,可以用sizeof测出长度。
79. 说出字符常量和字符串常量的区别,并使用运算符sizeof计算有什么不用?
字符常量是指单个字符,字符串常量以‘\\0’结束,使用运算符sizeof计算多占一字节的存储空间。
85. 函数指针和指针函数的区别:
函数指针是指指向一个函数入口的指针;
指针函数是指函数的返回值是一个指针类型。
87. 简述Debug版本和Release版本的区别?
Debug版本是调试版本,Release版本是发布给用户的最终非调试的版本,
88. 指针的几种典型应用情况?
int *p[n];-----指针数组,每个元素均为指向整型数据的指针。
int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。 int *p();----------函数带回指针,指针指向返回的值。 int (*)p();------p为指向函数的指针。
90. struct(结构) 和 union(联合)的区别?
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
91. class 和 struct 的区别?
struct 的成员默认是公有的,而类的成员默认是私有的。
92. 简述枚举类型?
枚举方便一次定义一组常量,使用起来很方便;
93. assert()的作用?
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。
94. 局部变量和全局变量是否可以同名?
答:能,局部会屏蔽全局。要用全局变量,需要使用\域运算符)。
95. 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
96. 在什么时候使用常引用?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
97. 类的声明和实现的分开的好处?