经典C++笔试题⽬100例
第⼀部分:C++与C语⾔的差异(1-18)
1、C 和 C++ 中 struct 有什么区别?
Protection⾏为能否定义函数
C⽆否,但可以有函数指针
C++有可以,默认是private
2、C++中的 struct 和 class 有什么区别?
【参考答案】从语法上讲,class和struct做类型定义时只有两点区别:
(⼀)默认继承权限。如果不明确指定,来⾃class的继承按照private继承处理,来⾃struct的继承按照public继承处理;
(⼆)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。 除了这两点,class和struct基本就是⼀个东西。语法上没有任何其它区别。
3、如何判断⼀段程序是由C 编译程序还是由C++编译程序编译的?
【标准答案】
#ifdef __cplusplus
cout<<“c++";
#else
printf("c");
#endif
复制代码
4、 C和C++有什么不同?
【参考答案】
从机制上:C是⾯向过程的(但C也可以编写⾯向对象的程序);C++是⾯向对象的,提供了类。但是,C++编写⾯向对象的程序⽐C容易。
从适⽤的⽅向:C适合要求代码体积⼩的,效率⾼的场合,如嵌⼊式;C++适合更上层的,复杂的; llinux核⼼⼤部分是C写的,因为它是系统软件,效率要求极⾼。
从名称上也可以看出,C++⽐C多了+,说明C++是C的超集;那为什么不叫C+⽽叫C++呢,是因为C++⽐C来说扩充的东西太多了,所以就在C后⾯放上两个+;于是就成了C++。
C语⾔是结构化编程语⾔,C++是⾯向对象编程语⾔。 C++侧重于对象⽽不是过程,侧重于类的设计⽽不是逻辑的设计。
5、“引⽤”与指针的区别是什么?
【参考答案】
指针通过某个指针变量指向⼀个对象后,对它所指向的变量间接操作。程序中使⽤指针,程序的可读性差;
⽽引⽤本⾝就是⽬标变量的别名,对引⽤的操作就是对⽬标变量的操作。
6、虚函数
class A  {
virtual void func1();
void func2();
} ;
class B: class A {
void func1() {
cout < < "fun1 in class B" < < endl;
}
virtual void func2() {
cout < < "fun2 in class B" < < endl;
}
}
复制代码const的作用
A、A中的func1和B中的func2都是虚函数
B、A中的func1和B中的func2都不是虚函数.
C、A中的func2是虚函数.,B中的func1不是虚函数.
D、A中的func2不是虚函数,B中的func1是虚函数.
【标准答案】A
7、int id[sizeof(unsigned long)]; 这个对吗?为什么?
【标准答案】正确 这个 sizeof是编译时运算符,编译时就确定了 可以看成和机器有关的常量。
8、某⽂件中定义的静态全局变量(或称静态外部变量)其作⽤域是 () ?
A.只限某个函数
B.本⽂件
C.跨⽂件
D.不限制作⽤域
【参考答案】B。静态全局变量则限制了其作⽤域, 即只在定义该变量的源⽂件内有效, 在同⼀源程序的其它源⽂件中不能使⽤它。
由于静态全局变量的作⽤域局限于⼀个源⽂件内,只能为该源⽂件内的函数公⽤, 因此可以避免在其它源⽂件中引起错误。
9、C++函数中值的传递⽅式有哪⼏种?
【标准答案】C++函数的三种传递⽅式为:值传递、指针传递和引⽤传递。
10、对于⼀个频繁使⽤的短⼩函数,在C语⾔中应⽤什么实现,在C++中应⽤什么实现?
【标准答案】C⽤宏定义,C++⽤ inline
11、引⽤与指针有什么区别?
【参考答案】
1) 引⽤必须被初始化,指针不必。
2) 引⽤初始化以后不能被改变,指针可以改变所指的对象。
3) 不存在指向空值的引⽤,但是存在指向空值的指针
12、C++中 virtual 与 inline 的含义分别是什么?
【参考答案】
在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。
inline与函数的定义体放在⼀起,使该函数称为内联。inline是⼀种⽤于实现的关键字,⽽不是⽤于声明的关键字。
## 虚函数的特点;
如果希望派⽣类能够重新定义基类的⽅法,则在基类中将该⽅法定义为虚⽅法,这样可以启⽤动态联编。
## 内联函数的特点;
使⽤内联函数的⽬的是为了提⾼函数的运⾏效率。
内联函数体的代码不能过长,因为内联函数省去调⽤函数的时间是以代码膨胀为代价的。
内联函数不能包含循环语句,因为执⾏循环语句要⽐调⽤函数的开销⼤。
13、VC 中,编译⼯具条内的 Debug 与 Release 选项是什么含义?
【参考答案】
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的,以便⽤户很好地使⽤。
Debug 带有⼤量的调试代码,运⾏时需要相应的运⾏库,发布模式程序紧凑不含有调试代码和信息,直接可以运⾏(如果不需要运⾏库)14、函数 assert 的⽤法?
【参考答案】
断⾔assert是仅在debug版本起作⽤的宏,⽤于检查“不应该“发⽣的情况。
程序员可以把assert看成⼀个在任何系统状态下都可以安全使⽤的⽆害测试⼿段。
15、 const  与 #define 的⽐较 ,const有什么优点?
【参考答案】
(1) const 常量有数据类型,⽽宏常量没有数据类型。编译器可以对前者进⾏类型安全检查。
⽽对后者只进⾏字符替换,没有类型安全检查,并且在字符替换可能会产⽣意料不到的错误(边际效应) 。
(2)有些集成化的调试⼯具可以对 const 常量进⾏调试,但是不能对宏常量进⾏调试。
16、请你谈谈引⽤和指针的区别。
【参考答案】
(1)引⽤被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。
(2)不能有 NULL 引⽤,引⽤必须与合法的存储单元关联(指针则可以是 NULL) 。
(3)⼀旦引⽤被初始化,就不能改变引⽤的关系(指针则可以随时改变所指的对象) 。
17、有了 malloc/free 为什么还要 new/delete  ?
【参考答案】
malloc 与 free 是 C++/C 语⾔的标准库函数,new/delete 是 C++的运算符。它们都可⽤于申请动态内存和释放内存。
对于⾮内部数据类型的对象⽽⾔,光⽤ maloc/free ⽆法满⾜动态对象的要求。对象在创建的同时要⾃动执⾏构造函数,对象在消亡之前要⾃动执⾏析构函数。
由于malloc/free 是库函数⽽不是运算符,不在编译器控制权限之内,不能够把执⾏构造函数和析构函数的任务强加于 malloc/free。
因此 C++语⾔需要⼀个能完成动态内存分配和初始化⼯作的运算符 new,以及⼀个能完成清理与释放内存⼯作的运算符 delete。
注意 new/delete 不是库函数。
18、如果在申请动态内存时不到⾜够⼤的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。你是怎么处理内存耗尽的?
【参考答案】
(1)判断指针是否为 NULL,如果是则马上⽤ return 语句终⽌本函数。
(2)判断指针是否为 NULL,如果是则马上⽤ exit(1) 终⽌整个程序的运⾏
(3)为 new 和 malloc 设置异常处理函数。例如 Visual C++可以⽤_set_new_hander 函数为 new 设置⽤户⾃⼰定义的异常处理函数,也可以让 malloc 享⽤与 new 相同的异常处理函数。
第⼆部分:数据类型、关键字(19-37)
19、C++是不是类型安全的?
【参考答案】不是。两个不同类型的指针之间可以强制转换(⽤reinterpret cast)。
20、const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上⾯三种描述的区别;
【参考答案】
(1) p是⼀个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;
(2) p指向的恰好是⼀个指向const的char的普通指针;
(3) p是⼀个指针,这个指针是指向char的const指针。
(1)和(2)的定义是⼀样的。
21、⽤C++写个程序,如何判断⼀个操作系统是16位还是32位的?
【标准答案】
定义⼀个指针p,打印出sizeof(p),如果节后是4,则表⽰该操作系统是32位,打印结果是2,表⽰是16位。
22、⽤C++写个程序,如何判断⼀个操作系统是16位还是32位的?不能⽤ sizeof() 函数。
【参考答案】
int a = ~0;
if(a > 65536) {
cout<<"32 bit"<<endl;
} else {
cout<<"16 bit"<<endl;
}
复制代码
23、识别函数或指针
void * ( * (*fp1)(int))[10];
float (*(* fp2)(int,int,int))(int);
int (* ( * fp3)())[10]();
分别表⽰什么意思?
【标准答案】
1、void * ( * (*fp1)(int))[10];  fp1是⼀个指针,指向⼀个函数,这个函数的参数为int型,函数的返回值是⼀个指针,这个指针指向⼀个数组,
这个数组有10个元素,每个元素是⼀个void*型指针。
2、float (*(* fp2)(int,int,int))(int);  fp2是⼀个指针,指向⼀个函数,这个函数的参数为3个int型,函数的返回值是⼀个指针,这个指针指向⼀个函数,
这个函数的参数为int型,函数的返回值是float型。
3、int (* ( * fp3)())[10]();  fp3是⼀个指针,指向⼀个函数,这个函数的参数为空,函数的返回值是⼀个指针,这个指针指向⼀个数组,这个数组有10个元素,每个元素是⼀个指针,指向⼀个函数,这个函数的参数为空,函数的返回值是int型。
24、多态类中的虚函数表是 Compile-Time,还是 Run-Time 时建⽴的?
【标准答案】
虚拟函数表是在编译期就建⽴了,各个虚拟函数这时被组织成了⼀个虚拟函数的⼊⼝地址的数组.⽽对象的隐藏成员--虚拟函数表指针是
在运⾏期--也就是构造函数被调⽤时进⾏初始化的,这是实现多态的关键。
25、错误的转义字符是?
A、'\091'
B、'\\'
C、'\0' D.'\''
【标准答案】A
26、若数组名作实参⽽指针变量作形参,函数调⽤实参传给形参的是?
A、数组的长度  B.数组第⼀个元素的值
C、数组所有元素的值
D、数组第⼀个元素的地址
【标准答案】D

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。