C++一些常见面试题---持续更新

1.变量的声明何定义有什么区别

变量的定义为变量分配地址和存储空间,变量的声明不分配地址。一个变量可以在多个地方声明,但是只在一个地方定义。同时加入extern修饰的变量的声明,说明此变量将在文件以外或在文件后面部分定义。
说明-很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

int main()
{
extern int A;
//这是个声明而不是定义,声明A是一个已经定义了的外部变量
//注意:声明外部变量时可以把变量类型去掉如:extern A;
dosth(); //执行函数
}
int A; //是定义,定义了A为整型的外部变量

2.简述#ifdef、#else、#endif和ifndef的作用

在程序中可以利用#ifdef、#endif将某一个模块的代码特殊定义,以向特定用户提供该功能。在不需要用户可以将其屏蔽。

#ifdef MATH
#include "math.c"
#endif

同时在window下应对硬件编译的时候,可以利用这种编译绕过硬件,直接进行编译得出预期的结果。
注意-虽然不用条件编译命令而直接用if语句也能达到要求,但那样做目标程序长,运行时间长,进行条件编译时,可以减少被编译的语句,从而减少目标程序的长度,减少运行时间。

3.写出int、bool、float、指针变量与"零值"比较的if语句

//int与零值比较
if ( n == 0 )
if ( n != 0 )
//bool与零值比较
if (flag) // 表示flag为真
if (!flag) // 表示flag为假
//float与零值比较
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON) //其中EPSINON是允许的误差(即精度)。
//指针变量与零值比较
if (p == NULL)
if (p != NULL)

4.结构体可以直接赋值吗

声明时可以直接初始化,同一结构体的不同对象之间也可以直接赋值,但是当结构体中含有指针"成员"时一定要小心。
注意-当有多个指针指向同一段内存时,某个指针释放这段内存可能会导致其他指针的非法操作。因此在释放前一定要确保其他指针不再使用这段内存空间

5.sizeof与strlen的区别

sizeof是一个操作符,strlen是库函数
sizeof的参数可以是数据的类型,也可以是变量。而strlen只能以结尾'\0'的字符串做参数
编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来,并且sizeof计算的数据类型占内存的大小,而strlen计算的是字符串实际的长度
数组做sizeof的参数不退化,传递给strlen就退化为指针了

6.c语言的关键字static和C++的关键字static有什么区别

在c中,static关键字用来修饰局部静态变量和外部静态变量、函数。在C++中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数
注意-在编程时static的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息

7.c语言的Malloc和C++中new delete的区别

new、delete是操作符,可以进行重载,只能在C++中使用
malloc、free是函数,可以覆盖,c与C++中都可以使用
new可以调用对象的构造函数,相应delete调用的是析构函数
malloc仅仅分配内存,free仅仅回收内存,并不执行构造与析构函数
new、delete返回的是某种数据类型指针,malloc、free返回的是void指针
注意-malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用

8.写一个"标准"宏MIN

# d e f i n e m i n ( a , b ) ( ( a ) < = ( b ) ? ( a ) : ( b ) )

9.++i和i++的区别

++i自增1再返回
i++先返回1,再自增1

10.volatile有什么作用

状态寄存器一类的并行设备硬件寄存器
一个中断服务子程序会访问到的非自动变量
多线程间被几个任务共享的变量
注意-虽然volatile在嵌入式方面应用比较多,但是在PC端软件的多线程中,volatile修饰的临界变量也是非常实用的

11.一个参数可以既是const又是volatile吗

答案是可以的,用const与volatile同时修饰变量,表示这个变量在程序内部是只读的,不能改变的,只在程序外部变化下改变,并且编译器不会优化这个变量。每次使用这个变量时,都要小心地去内存读取这个变量的值,而不是去寄存器读取它的备份。
注意-在此一定要注意const的意思,const只是不允许程序中的代码改变某一变量,其在编译期发挥作用,它并没有实际地禁止某段内存的读写性。

12.a和&a有什么区别?

&a表示的意思时变量a的地址
a在不同的地方有不同的含义
在声明语句中,a只说明a是一个变量,int a
在其他语句中,a前面没有操作数且a是一个指针时,a代表指针a指向的地址内存放的数据,如b=*a

13.用c编译一个死循环程序

while(1)
{ }

注意-很多途径都可以实现同一种功能,但是不同的方法时间和空间占用度不同,特别是读与嵌入式软件,处理器速度比较慢,存储空间较小,所以时间和空间优势时选择各种方法的首要考虑条件。

14.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

全部变量是整个程序都可以访问的变量,谁都可以访问,生存期在整个程序从运行到结束-在程序结束时所占内存释放
局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束调用完毕,局部变量消失,所占据的内存释放
操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序运行得到时候记载,局部变量则分配在堆栈里面。

15.简述C和C++程序编译的内存分配情况

从静态存储区域分配-内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量,常量字符串等
在栈上分配-在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动释放。
在堆上分配-即动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时使用free和delete释放内存。动态内存的生存期有程序员决定。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块

猜你喜欢

转载自blog.51cto.com/13475106/2586629