C++秋招记录(九)——C v.s. C++

c++面试

C v.s. C++

1、简单描述一下你认为的C语言的优点和缺点?

(1)编写的程序可读性强,编译效率高。
(2)具有简洁紧凑、使用灵活的语法机制。
(3)数据结构丰富,满足多种数据开发要求。
(4)允许直接访问物理地址,对硬件进行操作。
(5)具有出色的可移植性,能在多种不同体系结构的软/硬件平台上运行。
缺点:
(1) C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
(2) C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
(3) C语言的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
(4) C语言表达方面的自由会增加风险。尤其是C语言对指针的使用。

2、 C和C++、GP的区别?

1)C++是C的超集;
2)C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++是一个面向对象,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
3)面向对象和泛型编程:OOP试图将datas与method关联一起;GP将datas与method分离开来

3、int fun() 和 int fun(void)的区别?

这里考察的是c 中的默认类型机制。
在c中,int fun() 会解读为返回值为int输入类型和个数没有限制, 而int fun(void)则限制输入类型为一个void;即使前面没有int,也是如此,但是在c++中如果没有返回类型将报错。
在c++下,这两种情况都会解读为返回int类型,输入void类型

4、在C中用const 能定义真正意义上的常量吗?C++中的const呢?

不能。c中的const仅仅是从编译层来限定,不允许对const 变量进行赋值操作,在运行期是无效的,所以并非是真正的常量(比如通过指针对const变量是可以修改值的),但是c++中是有区别的,c++在编译时会把const常量加入符号表,以后(仍然在编译期)遇到这个变量会从符号表中查找,所以在C++中是不可能修改到const变量的。
1) c中的局部const常量存储在栈空间,全局const常量存在只读存储区,所以全局const常量也是无法修改的,它是一个只读变量。
2) 这里需要说明的是,常量并非仅仅是不可修改,而是相对于变量,它的值在编译期已经决定,而不是在运行时决定。
3)c++中的const 和宏定义(#definde)是有区别的,宏是在预编译期直接进行文本替换(不可以进行类别检测),而const发生在编译期,是可以进行类型检查和作用域检查的。
4)c语言中只有enum可以实现真正的常量。
5) c++中只有用字面量初始化的const常量会被加入符号表,而变量初始化的const常量依然只是只读变量。
6). c++中const成员为只读变量,可以通过指针修改const成员的值,另外const成员变量只能在初始化列表中进行初始化

5、C和C++中struct的区别是什么?

C语言中的struct与C++中的struct的区别表现在以下3个方面:
(1) C语言的struct不能有函数成员,而C++的struct可以有。
(2) C语言的struct中数据成员没有private、public和protected访问权限的设定,而C++ 的struct的成员有访问权限设定。
(3) C语言的struct是没有继承关系的,而C++的struct却有丰富的继承关系。
C语言中的struct是用户自定义数据类型,它是没有权限设置的,它只能是一些变量的集合体,虽然可以封装数据却不可以隐藏数据,而且成员不可以是函数。为 了和C语言兼容,C++中就引入了 struct关键字。C++语言中的struct是抽象数据类型 (ADT),它支持成员函数的定义,同时它增加了访问权限,它的成员函数默认访问权限为 public。

6、C++中的 struct与class的区别是什么?

具体而言,在C++中,class和struct做类型定义时只有两点区别:
(1) 默认继承权限不同。class继承默认是private继承,而struct继承默认是public继承;
(2) class还用于定义模板参数,就像typename,但关键字struct不用于定义模板参数。

7、C++是不是类型安全的?

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

8、 C和C++中的强制类型转换?

C中是直接在变量或者表达式前面加上(小括号括起来的)目标类型来进行转换,一招走天下,操作简单,但是由于太过直接,缺少检查,因此容易发生编译检查不到错误,而人工检查又及其难以发现的情况;而C++中引入了下面四种转换:

  • 1). static_cast
    a. 用于基本类型间的转换
    b. 不能用于基本类型指针间的转换
    c. 用于有继承关系类对象间的转换和类指针间的转换
  • 2). dynamic_cast
    a. 用于有继承关系的类指针间的转换
    b.用于有交叉关系的类指针间的转换
    c. 具有类型检查的功能
    d. 需要虚函数的支持
  • 3). reinterpret_cast
    a. 用于指针间的类型转换
    b. 用于整数和指针间的类型转换
  • 4). const_cast
    a. 用于去掉变量的const属性
    b.转换的目标类型必须是指针或者引用

在C++中,普通类型可以通过类型转换构造函数转换为类类型,那么类可以转换为普通类型吗?答案是肯定的。但是在工程应用中一般不用类型转换函数,因为无法抑制隐式的调用类型转换函数(类型转换构造函数可以通过explicit来抑制其被隐式的调用),而隐式调用经常是bug的来源。实际工程中替代的方式是定义一个普通函数,通过显式的调用来达到类型转换的目的。

9、C++中所有的运算符都能重载吗?

在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。
(1)不能改变 C++内部数据类型(如 int,float 等)的运算符。
(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。
(3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

10、C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?

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

11、头文件中的 ifndef/define/endif 是干什么用的? 该用法和 program once 的区别?

相同点:它们的作用是防止头文件被重复包含。
不同点:

  • 1). ifndef 由语言本身提供支持,但是 program once一般由编译器提供支持,也就是说,有可能出现编译器不支持的情况(主要是比较老的编译器)
  • 2). 通常运行速度上 ifndef 一般慢于program once,特别是在大型项目上, 区别会比较明显,所以越来越多的编译器开始支持 program once。
  • 3).ifndef 作用于某一段被包含(define 和 endif 之间)的代码, 而 program once 则是针对包含该语句的文件,这也是为什么 program once 速度更快的原因。
  • 4). 如果用 ifndef包含某一段宏定义,当这个宏名字出现“撞车”时,可能会出现这个宏在程序中提示宏未定义的情况(在编写大型程序时特性需要注意,因为有很多程序员在同时写代码)。相反由于program once 针对整个文件, 因此它不存在宏名字“撞车”的情况, 但是如果某个头文件被多次拷贝,program once无法保证不被多次包含,因为program once 是从物理上判断是不是同一个头文件,而不是从内容上。

12、C语言中struct和union的区别是什么?

struct (结构体)与union (联合体)是C语言中两种不同的数据结构,两者都是常见的复合结构,其区别主要表现在以下两个方面:

  • (1)结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。所以结构体在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。
  • (2)对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了, 而对结构体的不同成员赋值是互不影响的。
    示例程序如下:
typedef union {
double i; int k[5]; char e;
} DATE; 
struct data {
int cat; DATE cow; double dog;
} max;
printf("%d"sizeof(struct date)+sizeof(max));

假设为32位机器,DATE是一个联合型变量,联合型变量公用空间,里面最大的变量类型是int[5],所以占用20个字节,而由于union中double占了8个字节,为了实现8字节对齐,所以union所占空间为24。而data是一个结构体变量,每个变量分开占用空间,依次为sizeof(int) +sizeof(DATE)+sizeof(double)=4+24+8=36,而double为8字节,为了8字节对齐,占用空间为40。所以打印结果是 24 + 40 = 64 个字节。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值