龙空技术网

C++面试题总结(二)

千锋IT小助手 196

前言:

目前各位老铁们对“静态全局变量过大可能会导致堆栈溢出”大约比较看重,同学们都想要了解一些“静态全局变量过大可能会导致堆栈溢出”的相关内容。那么小编在网上网罗了一些关于“静态全局变量过大可能会导致堆栈溢出””的相关资讯,希望同学们能喜欢,咱们一起来学习一下吧!

51. 引用与指针有什么区别?

答 :

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

52. 描述实时系统的基本特性

答 、在特定时间内完成特定的任务,实时性与可靠性。

54. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

答 、全局变量储存在静态数据区,局部变量在堆栈中。

55. 堆栈溢出一般是由什么原因导致的?

答 、没有回收垃圾资源

56. 什么函数不能声明为虚函数?

答 :构造函数(constructor)

57. IP地址的编码分为哪俩部分?

答: IP地址由两部分组成,网络号和主机号。

58. 不能做switch()的参数类型是:

答 :switch的参数不能为实型。

59. 如何引用一个已经定义过的全局变量?

答 :可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

60. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

答 、c用宏定义,c++用inline

61. C++是不是类型安全的?

答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)

62. 当一个类A 中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少,请解释一下编译器为什么没有让它为零。

答案:为1。举个反例,如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。

63. 简述数组与指针的区别?

答:数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。

(1)修改内容上的区别

char a[] = "hello";

a[0] = 'X';

char *p = "world"; // 注意p 指向常量字符串

p[0] = 'X'; // 编译器不能发现该错误,运行时错误

(2) 用运算符sizeof 可以计算出数组的容量(字节数)。sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。

64. C++函数中值的传递方式

答:有三种方式:值传递、指针传递、引用传递

65. 内存的分配方式

答:分配方式有三种,

1、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。

2、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。

3、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。

66. extern"C"有什么作用?

答:Extern "C"是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren "c"后,C++就能直接调用C函数了。

Extern "C"主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern "c" 关键字即可。可以用一句话概括extern "C"这个声明的真实目的:实现C++与C及其它语言的混合编程。

67. 用什么函数开启新进程、线程。

答案:

线程:CreateThread/AfxBeginThread等

进程:CreateProcess等

68. SendMessage和PostMessage有什么区别

答案:SendMessage是阻塞的,等消息被处理后,代码才能走到SendMessage的下一行。PostMessage是非阻塞的,不管消息是否已被处理,代码马上走到PostMessage的下一行。

69. CMemoryState主要功能是什么

答案:查看内存使用情况,解决内存泄露问题。

70. #include <filename.h> 和 #include "filename.h" 有什么区别?

答:对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h

对于#include "filename.h" ,编译器从用户的工作路径开始搜索 filename.h

71. 处理器标识#error的目的是什么?

答:编译时输出一条错误信息,并中止继续编译。

72. #if!defined(AFX_…_HADE_H)

#define(AFX_…_HADE_H)

……

#endif作用?

答:防止该头文件被重复引用。

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位

77. strcpy()和memcpy()的区别?

答:strcpy()和memcpy()都可以用来拷贝字符串,strcpy()拷贝以'\0'结束,但memcpy()必须指定拷贝的长度。

78. 说明define和const在语法和含义上有什么不同?

答:(1) #define是C语法中定义符号变量的方法,符号常量只是用来表达一个值,在编译阶段符号就被值替换了,它没有类型;

(2) Const是C++语法中定义常变量的方法,常变量具有变量特性,它具有类型,内存中存在以它命名的存储单元,可以用sizeof测出长度。

79. 说出字符常量和字符串常量的区别,并使用运算符sizeof计算有什么不用?

答:字符常量是指单个字符,字符串常量以'\0'结束,使用运算符sizeof计算多占一字节的存储空间。

80. 简述全局变量的优缺点?

答:全局变量也称为外部变量,它是在函数外部定义的变量,它属于一个源程序文件,它保存上一次被修改后的值,便于数据共享,但不方便管理,易引起意想不到的错误。

81. 总结static的应用和作用?

答:

(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;

(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

82. 总结const的应用和作用?

答:

(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;

(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;

(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;

(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为"左值"。

83. 什么是指针?谈谈你对指针的理解?

答:指针是一个变量,该变量专门存放内存地址;

指针变量的类型取决于其指向的数据类型,在所指数据类型前加*

指针变量的特点是它可以访问所指向的内存。

84. 什么是常指针,什么是指向常变量的指针?

答:常指针的含义是该指针所指向的地址不能变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其它的变量。

指向常变量的指针是指该指针的变量本身的地址可以变化,可以指向其它的变量,但是它所指的内容不可以被修改。指向长变量的指针定义。

85. 函数指针和指针函数的区别?

答:函数指针是指向一个函数入口的指针;

指针函数是函数的返回值是一个指针类型。

87. 简述Debug版本和Release版本的区别?

答:Debug版本是调试版本,Release版本是发布给用户的最终非调试的版本,

88. 指针的几种典型应用情况?

答:

int *p[n];-----指针数组,每个元素均为指向整型数据的指针。

int (*)p[n];---p为指向一维数组的指针,这个一维数组有n个整型数据。

int *p();------函数带回指针,指针指向返回的值。

int (*)p();----p为指向函数的指针。

89. static函数与普通函数有什么区别?

答:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

90. struct(结构) 和 union(联合)的区别?

答:1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。

2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

91. class 和 struct 的区别?

答:struct 的成员默认是公有的,而类的成员默认是私有的。

92. 简述枚举类型?

答:枚举方便一次定义一组常量,使用起来很方便;

93. ASSERT()的作用?

答:ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

94. 局部变量和全局变量是否可以同名?

答:能。局部会屏蔽全局。要用全局变量,需要使用"::"(域运算符)。

95. 程序的不同变量的不同存储位置

答:局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

96. 在什么时候使用常引用?

答:如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

97. 类的声明和实现的分开的好处?

答:

1. 起保护作用;

2. 提高编译的效率。

98. windows消息系统由哪几部分构成?

答:由一下3部分组成:

1. 消息队列:操作系统负责为进程维护一个消息队列,程序运行时不断从该消息队列中获取消息、处理消息;

2. 消息循环:应用程序通过消息循环不断获取消息、处理消息。

3. 消息处理:消息循环负责将消息派发到相关的窗口上使用关联的窗口过程函数进行处理。

99. 什么是消息映射?

答:消息映射就是让程序员指定MFC类(有消息处理能力的类)处理某个消息。然后由程序员完成对该处理函数的编写,以实现消息处理功能。

100.什么叫智能指针?

答:当一个类中,存在一个指向另一个类对象的指针时,对指针运算符进行重载,那么当前类对象可以通过指针像调用自身成员一样调用另一个类的成员。

101. winsock建立连接的主要实现步骤?

答:

服务器端:socket()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接, accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

客户端:socket()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。

102.多态的两个必要条件

答:1.一个基类的指针或引用指向一个派生类对象 2.虚函数

103. 构成Win32 API 函数的三个动态链接库是什么?

答:内核库,用户界面管理库,图形设备界面库。

104.什么时候需要用虚析构函数?

答:当基类指针指向用new运算符生成的派生类对象时,delete基类指针时,派生类部分没有释放掉而造成释放不彻底现象,需要虚析构函数。 补充:虚函数就是让派生类调用基类的虚函数。

105. 什么是平衡二叉树?

答:左右子树都是平衡二叉树,而且左右子树的深度差值的约对值不大于1。

106. 派生新类的过程要经历三个步骤

答:1.吸收基类成员 2.改造基类成员 3.添加新成员

107. 简单介绍GDI?

答: GDI是Graphics Device Interface 的缩写,译为:图形设备接口;是一个在Windows应用程序中执行与设备无关的函数库,这些函数在不同的输出设备上产生图形以及文字输出。

108.在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern "C"?

答:C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字

与C 语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号extern"C"来解决名字匹配问题。

109. 怎样定义一个纯虚函数?含有纯虚函数的类称为什么?

答:在虚函数的后面加=0,含有虚函数的类称为抽象类。

110. 简述Visual C++ 、Win32 API和MFC之间的关系?

答:(1) Visual C+是一个以C++程序设计语言为基础的、集成的、可视化的编程环境;

(2) Win32 API是32位Windows操作系以C/C++形式提供的一组应用程序接口;

(3) MFC是对Win32 API的封装,简化了开发过程。

111.怎样消除多重继承中的二义性?

答: 1.成员限定符 2.虚基类

112什么叫静态关联,什么叫动态关联

答:在多态中,如果程序在编译阶段就能确定实际执行动作,则称静态关联,

如果等到程序运行才能确定叫动态关联。

标签: #静态全局变量过大可能会导致堆栈溢出