概述
C与C++的差异
- 【题目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
cout<<"c";
#endif
- 【题目4】
C和C++有什么不同?
【参考答案】
从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易。
从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的;Linux核心大部分是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;}
}
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】
有了 malloc/free 为什么还要 new/delete ?
【参考答案】
malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。 因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。- 【题目17】
如果在申请动态内存时找不到足够大的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。你是怎么处理内存耗尽的?
【参考答案】
(1)判断指针是否为 NULL,如果是则马上用 return 语句终止本函数。(2)判断指针是否为 NULL,如果是则马上用 exit(1)终止整个程序的运行 (3)为 new 和 malloc 设置异常处理函数。例如 Visual C++可以用_set_new_hander 函数为 new 设置用户自己定义的异常处理函数,也可以让 malloc 享用与 new 相同的异常处理函数。
数据类型、关键字
- 【题目1】
C++是不是类型安全的?
【参考答案】
不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。- 【题目2】
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)的定义是一样的。
- 【题目3】
用C++写个程序,如何判断一个操作系统是16位还是32位的?
【参考答案】
定义一个指针p,打印出sizeof(p),如果节后是4,则表示该操作系统是32位,打印结果是2,表示是16位。
- 【题目4】
用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数。
【参考答案】
int a = ~0;
if( a>65536 )
{
cout<<"32 bit"<<endl;
}
else
{
cout<<"16 bit"<<endl;
}
- 【题目5】
1. void * ( * (*fp1)(int))[10];
2. float (*(* fp2)(int,int,int))(int);
3. 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型。
- 【题目6】
多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?
【参考答案】
虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组。而对象的隐藏成员——虚拟函数表指针是在运行期——也就是构造函数被调用时进行初始化的,这是实现多态的关键。
- 【题目7】
错误的转义字符是 ()
A.'