面试题——C/C++的区别与联系

一、面向过程语言和面向对象语言

我们都知道C语言是面向过程语言,而C++是面向对象语言,说C和C++的区别,也就是在比较面向过程和面向对象的区别。C与C++的最大区别:在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。

1.面向过程和面向对象的区别
(1)面向过程:面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。
(2)面向对象:面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。

举个例子:(玩五子棋)
(1)用面向过程的思想来考虑就是:开始游戏,白子先走,绘制画面,判断输赢,轮到黑子,绘制画面,判断输赢,重复前面的过程,输出最终结果。
(2)用面向对象的思想来考虑就是:黑白双方(两者的行为是一样的)、棋盘系统(负责绘制画面)、规定系统(规定输赢、犯规等)、输出系统(输出赢家)。
面向对象就是高度实物抽象化(功能划分)、面向过程就是自顶向下的编程(步骤划分)

2.面向过程和面向对象的优缺点
在学习一些比较抽象的概念时,由于我们的理解能力很有限,有时候一些比较恰当的例子也是有助于我们学习的,因此对二者的优缺点比较,还是先举例子,后总结吧!
(1)用面向过程写出来的程序就像一份蛋炒饭,也就是米饭和炒的菜均匀的混合在了一起,因此蛋炒饭入味均匀,不会像盖浇饭那样,可能有时候吃的菜多饭少,还有时候菜少饭多。但是如果你不喜欢吃蛋炒饭,只想吃肉炒饭,那么原来做的这份蛋炒饭就得倒掉了,重新做一份肉炒饭,厨师就得辛苦了!

(2)用面向对象写出来的程序就像一份盖浇饭,也就是米饭和盖菜分别做好,将盖菜放在米饭上面,盖浇饭虽然没有蛋炒饭那样入味均匀,但是如果给了你一份土豆丝盖饭,你又不想吃了,换成牛肉盖饭,厨师只需要将米饭上面的土豆丝倒掉,重新做一份牛肉放在上面就好了。

那么到底蛋炒饭和盖浇饭哪个好吃呢?
我觉得各有优劣,谁也不能说到底哪个好,毕竟蛋炒饭的餐馆和盖浇饭的餐馆都很多,而且生意都很不错,存在即为合理!
如果非要将二者进行一个高地的比较的话,那就得先设定一个场景了!
盖浇饭的好处就是”菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用专业术语来说就是”可维护性“较好,”饭” 和”菜”的耦合度比较低。
蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。

基于上述的例子,二者的优劣总结如下:

面向过程语言

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 
缺点:没有面向对象易维护、易复用、易扩展

面向对象语言:

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 
缺点:性能比面向过程低

二、具体语言的区别

1.关键字不同
C99有32个关键字
C++98有63个关键字
一些关键字的细微区别:
(1)struct:在C语言中struct定义的变量中不能有函数,而在C++中可以有函数。
(2)malloc :malloc函数的返回值为void*,在C语言中可以赋值给任意类型的指针,在C++中必须强制类型转换,否则报错。
(3)struct和class:class是对struct的扩展,struct默认的访问权限是public,而class默认的访问权限是private。

2.后缀名不同
C源文件后缀.c,C++源文件后缀.cpp,在VS中,如果在创建源文件时什么都不给,默认是.cpp。
3.返回值
C语言中,如果一个函数没有指定返回值类型,默认返回int类型;C++中,如果一个函数没有返回值则必须指定为void。

在这里插入图片描述
4.参数列表
在C语言中,函数没有指定参数列表时,默认可以接收任意多个参数;但在C++中,因为严格的参数类型检测,没有参数列表的函数,默认为 void,不接收任何参数。
在这里插入图片描述
5.缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的参。(C语言不支持缺省参数)
在这里插入图片描述
(1)半缺省参数

void FunTest(int _iParam1, int _iParam2 = 0 )
{}
void FunTest(int _iParam1, int _iParam2 = 0 , int _iParam3/* = 0*/)
{}
void FunTest(int _iParam1, int _iParam2 /* = 0*/,int _iParam3 = 0)
{}

(2)全缺省参数

void FunTest(int _iParam1 = 0, int _iParam = 1)
{ }

//注意:慎用缺省函数,否则会产生二义性

void FunTest ()
{}
void FunTest (int a = 10 )
{}

//假如使用不带实参方式调用FunTest()函数时,编译器将不知道调用哪一个,产生二义性

注意:
(1)在半缺省的情况下,带缺省值的参数必须放在参数列表的最后面。
(2)缺省参数不能同时在函数的声明和函数定义中出现,二者只能选其一。
(3)缺省值必须是常量或者全局变量。
(4)缺省参数必须通过值参或常参传递。

6.函数重载
函数重载:函数重载是函数的一种特殊情况,指在同一作用域中,声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同,返回值类型可以相同也可以不同,常用来处理实现功能类似数据类型不同的问题。(C语言没有函数重载,C++支持函数重载)。
在这里插入图片描述
来看个例子:

//下面两个函数算函数重载吗?
void FunTest6()
{ } int
FunTest6()
{
return 0;
}

//答案是不能,因为仅仅返回值类型不同,不能构成重载

一些简单的相关面试题
1 C和C++有什么不同?
参见上文

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

(1) 结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。所以结构体在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中, 所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。

(2) 对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了, 而对结构体的不同成员赋值是互不影响的。

示例程序如下:

typedef union {double i; int k[5]; chare;} 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 个字节。

3 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。

4 C++中的 struct与class的区别是什么?
具体而言,在C++中,class和struct做类型定义时只有两点区别:

(1) 默认继承权限不同。class继承默认是private继承,而struct继承默认是public继承;

(2) class还用于定义模板参数,就像typename,但关键字struct不用于定义模板参数。

5 ©简单描述一下你认为的C语言的优点和缺点?
优点:

(1)编写的程序可读性强,编译效率高。

(2)具有简洁紧凑、使用灵活的语法机制。

(3)数据结构丰富,满足多种数据开发要求。

(4)允许直接访问物理地址,对硬件进行操作。

(5)具有出色的可移植性,能在多种不同体系结构的软/硬件平台上运行。

缺点:

(1) C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。

(2) C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。

(3) C语言的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。

(4) C语言表达方面的自由会增加风险。尤其是C语言对指针的使用。

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

7 谈谈你是怎么认识 C++ 中的模板的?
模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现,方便了大规模的软件开发。(结合stl更好)

8 C++中所有的运算符都能重载吗?
在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。

(1)不能改变 C++内部数据类型(如 int,float 等)的运算符。

(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。

(3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。

(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

9 以下代码有什么问题?

cout << (true?1:"1") << endl;

【参考答案】三元表达式“?:”问号后面的两个操作数必须为同一类型

文章参考来源:https://blog.csdn.net/cherrydreamsover/article/details/81835976

  • 44
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥抱@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值