关键词不能为空

当前您在: 主页 > 英语 >

c++经典面试题

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:39
tags:

-

2021年3月3日发(作者:camozzi)



1.



C

< p>


C++



struct


有什么区别?



C

语言中:


Struct


是用户自定义数据类型(

< p>
UDT




C++


语言中:


Struct


是抽象数据类型(


ADT

),支持成员函数的定义。




C ++


中,


struct


的成员的默认访 问说明符为


public



class



private


< br>


c


中的


struct


是没有权限设置的。



C++



struct


增加了访问权限


,


且可以和类一样有成员函数。



C ++


中的


struct


等同于


class,


只是


class

< br>默认成员权限是


private,


struct


默认成员权限是


public




1>


< br>C++


中的


struct


类似于


class


,有变量,有构造函数、虚函数等,有


继承,多态等类的特征;



2>



2> C


中的


struct


只有变量,不能有函数,但是可以有函数指 针




2.



C++


中的


struct



class


有什么区别?




C++


中,两者区别不大,但是有< /p>


2


个主要的区别



1>.


继承权限:


struct


默认 是


public


继承;


class


默认是


private


继承



1



2>.

< p>
访问权限:


struct


默认是

< br>public


访问;


class


默认是


private


访问




3.


如何判断一段程序是由


C


编译程序还是由


C++


编译程序编译的?



【标准答案】





#ifdef __cplusplus



cout<<“c++



#else



cout<<



#endif



(这个以前还真没注意过,涨姿势了。。。)




4. C



C++


有什么不同


?



【参考答案】



从机制上:




c


是面向过程的(但


c


也可以编写面 向对象的程序);



c++


是面向对象 的,


提供了类。


但是,


c++


编写面向对象的程序比


c


容易。





2





从适用的方向:



c

< br>适合要求代码体积小的,效率高的场合,如


嵌入式



c++


适合更上层的,复杂的


; linu x


核心大部分是


c


写的,因为它是系统


软件,效率要求极高。



从名称上也可 以看出,


c++



c

< br>多了


+


,说明


c++

< p>


c


的超集;那为什么


不 叫


c+


而叫


c++

呢,


是因为


c++




c


来说扩充的东西太多了,


所以就在


c


后面放上两个


+


;于是就成了


c++






C


语言< /p>


是结构化编程语言,


C++


是面向对象编 程语言。



C++


侧重于对象


而不是过程,侧重于类的设计而不是逻辑的设计。




关于这个问题,个人觉得《


Effective C++


》上面第一条说的很好,



View C++ as a federation of languages.



C++


当做一个语言联邦。




C++


由四部分组成



1>


c


语言


部分;

< p>


2>


面向对象部分,包括封装、继承、多态这些


C


语言所没有的特性;



3>


泛型编程部分,


大多数类、

函数要考虑到把它设计成模板,


方便复用;



3



4> STL


库,里面封装了大量的优秀模板,是


< br>3>


中内容的集成,学会使


用它们可以让代码更高效。< /p>


当然,


最好去深入了解


STL

< p>
源码,


那样会对


C++


有 更深的理解。




5.“


引用



与指针的区别是什么?



【参考答案】



指针通过某个指针 变量指向一个对象后,对它所指向的变量间接操作。



程序中使 用指针,程序的可读性差;而引用本身就是目标变量的别名,


对引用的操作就是对目标变 量的操作。



在另一本


C++


著作



More Effective C++



里,


第一条就是论述



point




reference


的区别



总结一下,



1>

指针是一个存储地址的变量,


而引用是一个变量的别名。


所 以在一个


函数中,传引用要比传指针速度更快。



2>


指针可以指向一个空值,


而引用必须初始化。< /p>


指针可以如下形式出现



[cpp]


view plaincopy



1.



int


*p;




是合法但不合理的


(


相当于是一个野指针


)




4



可以声明一个指向空值的指针



[cpp]


view plaincopy



1.



int


*p=null





而引用不行



[cpp]


view plaincopy



1.



int


&r;




是错误的



引用必须初始化为一个变量的别名,如



[cpp]


view plaincopy



1.



int


a=5;




2.



int


&r=a;





3>


也是因为


2>


的特性,指针在使用前 要判断是否为空,而引用必定不为空


(



则会报错


)


,所以不用判断。




4>


指针可以更改指向的内存地址, 而引用是和变量绑定的,不可更改。





5>


在运算符重载过程中,通常返回 一个引用往往比返回一个指针更好,


使用指针易引起语义上的歧义。



6.



5



class A



{



virtual void func1()






void func2();



}





class B: class A



{



void func1()



{



cout<<



}











virtual void func2()










{














cout<<



6










}



A, A


中的


func1



B


中的


func2


都是虚函数



B, A


中的


func1



B


中的


func2


都不是虚函数


.



C, A


中的

< br>func2


是虚函数


.



B


中的


func1


不 是虚函数


.



D, A


中的


func2


不是虚函数,


B


中的


func1


是虚函数


.




【标准答案】


A



水题。。




id[sizeof(unsigned long)];


这个对吗?为什么?



【标准答案】



正确




这个


sizeof


是编译时运算符,


编译时就确定了



可以看成和机器有关的


常量。




8.


某文件中定义的静态全局变量< /p>


(


或称静态外部变量


)

< br>其作用域是


()?


A.


只限某个函数


B.


本文件



7





C.


跨文件


D.


不限制作用域






【参考答案】

B


。静态全局变量则限制了其作用域,



即只在定义该变量


的源文件内有效,



在同一源程序的其它源文件中不能使用它。由于静


态全局变量的 作用域局限于一个源文件内,


只能为该源文件内的函数公


用,< /p>



因此可以避免在其它源文件中引起错误。




在《


C


和指 针》上看过,


static


关键字会改变具有外部链接性的变量 和


函数




9 .C++


函数中值的传递方式有哪几种


?



【标准答案】



C++

< p>
函数的三种传递方式为:值传递、指针传递和引用传递。



(


指针传递就是通常说的地址传递


)

< br>



10.


对于一个频繁使用的 短小函数


,



C


语言中应用什么实现


,



C++



应用什么实现


?



8




【标 准答案】


c


用宏定义,


c++



inline



de fine


实现的函数功能容易出


bug


,所以在


c++


中最好不要使用



11.


引用与指针有什么区别?



【参考答案】




1)


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



2)


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




3)


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




可以参考下





5


题中补充的内容



< br>12.C++



virtual



inline


的含义分别是什么?



【参考答案】



在基类成员函数的声明 前加上


virtual


关键字,


意味着 将该成员函数声明


为虚函数。



inl ine


与函数的定义体放在一起,使该函数称为内联。



inline


是一种用于实现的关键字,而不是用于声明的关键字。< /p>



??



虚函数 的特点;如果希望派生类能够重新定义基类的方法,


则在基类中


将该方法定义为虚方法,这样可以启用动态联编。



??



内联函数的特点;


使用内联函数的目的是为了提高函数的运行效率。内


联函数体的代码不能过长 ,


因为内联函数省去调用函数的时间是以代码


9



膨胀为代价的。内联函数不能包含循环语句,


因为执行循环语句要比调


用函数的开销大。




哈!我想我确实要注意一下表达能力。





13.

VC


中,编译工具条内的


Debug



Release


选项是什么含义?



【参考答案】



Debug


通常称为调试版本,它包含调试信息,并且不作任何优化,便


于程序员调 试程序。



Release


称为发布 版本,


它往往是进行了各种优化,


使得程序在代码大

< p>
小和运行速度上都是最优的,以便用户很好地使用。





Debug


带有大量的调试代码,运行时需要相应的运行库,



发布模式 程序紧凑不含有调试代码和信息,直接可以运行


(如果不需要


运 行库)




14.

函数


assert


的用法


?


【参考答案】断言


assert


是仅在


debug


版本起作用的宏,用于检查“不


应该“发生的情况。程序员可以把


assert


看成一个在任何 系统状态下都


可以安全使用的无害


测试


手段



10






VC+ +


的时候见过


assert


宏定义,但 是自己从来没用过。










#define


的比较




c onst


有什么优点


?


【参考答案】




1




const


常量有数据类型,而宏常量没有数据类型。编译器 可以对


前者进行类型安全检查。


而对后者只进行字符替换,


没有类型安全检查,


并且在字符替换可能会产生意料不到的错误(边 际效应)





#define


不能生成


< p>
类的专属常量,因为它只是进行简单的替换。





2





有些集成化的调试工具可以对



const


常量进行调试,但是不能


对宏常量进行调试。






Effective C++


》中建 议以


const



enum

< p>


inline


代替


#d efine




使用

< br>enum


的原因



有些情况下, 编译器不允许静态常量出现在类的初始设定中,只得以


enum


的形式



另一方面,


enum



#define


更相似,它们都没有具体的类 型,比如,



constint a;


却没有



#define N int a



enum



#define


都不能够被去


地址,而


const


可以。




11



16.


请你谈谈引用和指针的区别。



【参考答案】



1


)引用被创建的同时必须被初始化(指针则可以在任何时候被初始


化)






2


)不能有



NULL


引用,引用必须与合法的存储单元关联


(指针则可


以是



NULL







3< /p>


)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改


变所指的对象)






不断地出现,可见这个问题是经常容易被问到的。




17.


有了



malloc/free


为什么还要



new/delete





【参考答案】



malloc




free




C++/C


语言的标准库函数,


new/delete




C++



运算符。它们都可用于申请动态内存和释放内存。




对于非内部数据类型的对象而言,


光用



malloc/free


无法满足动态对象


的要求。



对象在创建的同时要自动执行构造函数,


对象在消亡之前要自动执行析< /p>


构函数。



由于


malloc/free


是库函 数而不是运算符,不在编译器控制权限之内,


不能够把执行构造函数和析构函数的任务强 加于



malloc/free




12



因此



C++


语言需要一个能完成动态内存分配和初始化工作的运算符



new


,以及一个能完成清理与释放 内存工作的运算符



delete


。注意



new/delete


不是库函数。





以前只是习惯在用


C


时用


malloc/free


,用


C++


时用


new/delet e


,没注


意到这些差异性。




18.


如果在申请动态内存时找不到 足够大的内存块,


malloc




new



返回



NULL


指针,宣告内存申请失败。你是怎么处理内存耗尽的?



【参考答案】



1



判断指针是否为


< p>
NULL



如果是则马上用



return


语句终止本函数。




2


)判断指针是否为



NULL


,如果是则马上用



exit(1)


终止整个程序的


运行< /p>




3


)为



new




malloc


设置异常处理函数。例如



Visual C++


可以用


_set_new_hander


函数为



new

设置用户自己定义的异常处理函数,



可以让



malloc


享用与



new


相同的异常处理函数。



我一般是直接


return






19.C++


是不是类型安全的?


< /p>


【参考答案】不是。两个不同类型的指针之间可以强制转换(用


1 3



reinterpret cast)





20. const


符号常量;



(1)const char *p



(2)char const *p (


3)char * const p



说明上面三种描述的区别;



【参考答案】



(1)p


是一个指向


const ch ar


的指针,


p


是可以改变指向的,但 是


p


指向


的值是不能改变的

< p>
;






(2)p


指向的恰好是一个指向< /p>


const



char

< br>的普通指针;



(3)p


是一个 指针,这个指针是指向


char



co nst


指针。







(1)



(2)


的定义是一样的。





1



2



3


的区别在于,


1



2



const


出现在


*


号左边,


3


出现在

< br>*


号右


边。好像也是在《


C


和指针》上看到的这句话。



21.



C++


写个程序,如何判断一个

< p>
操作系统



16


位还是< /p>


32


位的?



【 标准答案】定义一个指针


p


,打印出


s izeof(p),


如果节果是


4


,则 表


示该操作系统是


32


位,打印结果是


2


,表示是


16


位。




14



22.



C ++


写个程序,


如何判断一个操作系统是


16


位还是


32


位的?不能



sizeof()


函数。


【参考答案】






[cpp]


view plaincopy



1.



int


a


=


~0;




2.



if(


a>65536


)




3.



{











4.



cout<<


bit







5.



}




6.



else




7.



{




8.



cout<<


bit




9.



}





这个参 考答案估计参考了不少年了。。。现在大部分机器都


32



64


位的了,所


以,应该把


65536


改为


4294967296


,来判断机器是


32



|| 64





23.



[cpp]


view plaincopy



1.



void


*


(


*


(*fp1)(int))[10];









2.



float


(*(*


fp2)(int,int,int))(int);










3.



int


(*


(


*


fp3)())[10]();






15


-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:39,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/699966.html

c++经典面试题的相关文章