C++面试题2



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


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


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


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


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


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


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


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


 


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


答 、没有回收垃圾资源
 


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


答: 构造函数(constructor):


 


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


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


 


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


答 、switch的参数不能为实型。实型数就是通常说的浮点数,包括float、double、long double等等类型。实型文字常量可以用科学计数法形式或者普通十进制形式表示。如2e5,1.0这样的
.
 


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来释放的内存。


内存空间中所包含的5种不同的数据区都是干什么的。  
BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 
数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。  
代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许 代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。  
堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)  
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。  它是由操作系统分配的,内存的申请与回收都由OS管理。  
PS:  全局的未初始化变量存在于.bss段中,具体体现为一个占位符;全局的已初始化变量存于.data段中;而函而函数内的自动变量都在栈上分配空间。.bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化,因此造成了上述情况。  bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。 data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。 数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。


一个由c/C++编译的程序占用的内存分为以下几个部分 
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
 


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 和 #include “filename.h” 有什么区别?


答:对于#include ,编译器从标准库路径开始搜索 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.  简述枚举类型?


答:枚举方便一次定义一组常量,使用起来很方便;枚举成员默认值在枚举类型中声明的第一个枚举成员它的默值为零。以后的枚举成员值是将前一个枚举成员的值加 1 得到。


 


93.  assert()的作用?


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


 


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


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


 


95.  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。


 


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


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


 


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


答:1.    起保护作用;


2.    提高编译的效率。


 


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


答:由一下3部分组成:


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


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


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


 


99.  什么是消息映射?


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


 


100. 什么是UDP和TCP的区别是什么?


答:TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。


UDP全称为用户报文协议,它可以提供非连接的不可靠的点到多点的通信。用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?


101,单例模式,赋值构造函数和拷贝构造函数都要声明为私有的,以便防止这类赋值的动作产生。返回最好是返回引用,要不然用户会不小心删除掉指针的(如果非要返回指针,最好将析构函数声明为私有的)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值