C/C++常见面试题(二)

本文详细介绍了C与C++的区别,包括面向过程与面向对象的特点,C++新增的特性如多态性、虚函数表、类型转换等,并解释了为何析构函数要定义成虚函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C与C++的区别

这个区别有好多,首先C是面向过程的,C++是面向对象的,所以C里没有类的概念,C++具有封装、继承、多态这样的面向对象特性;然后C++使用了STL模板库;C++在很多概念上对C做了扩展,比如static关键字,在C++中可以用在成员函数前面表示静态成员函数;c++具有流式输入输出,inline关键字,引用变量等新特性。
多态性都有哪些

一是编译时的多态性,二是运行时的多态性。

编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。即父类引用指向子类对象。

动态绑定(联编)怎么实现

绑定是为了确定函数调用与执行的代码段之间的关系。静态绑定在编译阶段完成,如类私有成员,静态成员。动态绑定在运行时完成,动态绑定方便了多态的实现。在C++中,动态绑定通过虚函数表实现,虚函数表里的每一个位置都是一个函数指针,含有虚函数的类有一个虚函数表指针。
类型转换有哪些

隐式转换和显示转换,隐式转换是C时代的遗留产物。显示转换分为四种:

static_cast
static_cast的适用范围和隐式转换相同,没有类型检查。
dynamic_cast
主要用于类层次间的上行和下行转换,待转换的类型只能是指针或引用,具有运行时类型检查。
reinterpret_cast
强制类型转换。
const_cast
用于增加或删除const特性,我记得effective c++里说这个主要为了方便非const函数操作const成员产量。

指针和const的用法?

int *p;//p是一个指向int类型的指针,p的值可以改变,p指向的值也可以改变
const int *p;//p是一个指向const int类型的指针,p的值可以改变,不能通过p修改其指向的值
int * const p;//p是一个指向int类型的从上图指针,p的值不可以改变,可以通过p修改其指向的值
const int * const p;//p是一个指向const int类型的const指针,p的值不可以改变,也不能通过p修改其指向的值

总的来说,这里把*看成向左结合的运算符,然后const右边紧跟什么,什么就是不可变的。
虚函数、纯虚函数如何定义,为什么析构函数要定义成虚函数?

在C++中,虚函数在函数前加virtual,纯虚函数就是普通的虚函数后面加上=0;Java中所有的函数默认都是虚函数,非虚函数需要在前面加上final,纯虚函数在前面加上abstract。
含有纯虚函数的类称为抽象类,全为纯虚函数的类称为接口,Java接口需用interface修饰。
析构函数定义成虚函数是为了避免只析构基类没有析构派生类造成内存泄露。
扩展:
C++虚函数==Java普通函数
C++纯虚函数==Java抽象函数
C++抽象类==Java抽象类
C++虚基类==Java接口
内联函数

类中定义的成员函数全部默认为内联函数,普通函数声明或定义前加inline也是内联函数。内联函数在编译后即不具有函数性质,被调用几次就会生成几段代码,用来节省函数调用的时间开销,但是会增加编译后的可执行文件大小。内联函数作用和宏类似,但是相对于宏具有很多优点。首先说一下宏的缺点:
1、宏不能访问对象的私有成员。
2、宏的定义很容易产生二义性。
使用内联函数的优点:
1.内联函数在运行时可调试,而宏定义不可以;
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;
3.内联函数可以访问类的成员变量,宏定义则不能;
4.不会存在宏那样的二义性问题。
const和typedef

使用const可以使编译器知道哪些参数是不应该被修改的,避免莫名其妙的错误。在C++中,只有被声明为const的成员函数才能被一个const对象调用。若将成员函数声明为const,则该函数不允许修改类的数据成员
typedef可以用简单的名字替换复杂的数据类型。
排序算法有哪些?快速排序怎么实现的?最好时间复杂度,平均时间复杂度,是否稳定?

这个问题简单,但是内容很多,我在这里专门写了一篇
判断是否稳定可以从每次移动的步长是否为1来看。
链接指示:extern“C”(作用)

extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
预编译、编译、运行

如前所述,Java没有预编译,C/C++的预编译指的是#的部分,即头文件和define宏,编译以后生成目标程序(C/C++生成.o,.a,Java生成.class),即一种字节流,运行以后生成可执行文件(windows下为exe)。
转载:发现贴子不错
作者:野月花环
來源:简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值