《基础知识——C和C++的主要区别》_ZHRHRH的博客-程序员宝宝

技术标签: C++面试宝典  《C++高频面试题》  

  • C和C++的主要区别

设计思想上:

C++是面向对象的语言,而C是面向过程的结构化编程语言

语法上:

C++具有封装、继承和多态三种特性

C++相比C,增加多许多类型安全的功能,比如强制类型转换、

C++支持范式编程,比如模板类、函数模板等

知乎复制

你问区别,那一定有区别,语言在设计走向上总是朝着更加优化和简便的方向去开发的,这是最原始的动机,也是根本区别,只不过相应的会保留前者的优势,后者会衍生出其他的优势和缺陷,而这些后面多出的各种不同才是人们津津乐道的“区别”。这就像一次十分耗时间的文档整理工作,经验有多丰富回答就有多少水平和高度,整理的东西会越规范和易于接受。

程序语言的设计者可能一直埋头干他想做的事:就只是想设计出一门好的语言。那这个好有什么呢,可能是跨平台,排版更美观,执行效率高,拓展性强,适用范围广等等,或许根本无暇去思考什么真正的区别,如果真的要探寻所谓的“真正”,估计只有创始人讲了才能为大家所接受,而且你还会深信不疑,只因为他们是最接近这门语言本质的人。

我们先不说真正的区别,先讨论区别在哪里我觉得更合适些。

===========================分割线===========================

本人根据编程经历和水平,想从几个层次回答,肯定不是绝对正确,给各位大牛献丑了。

1、首先C和C++在基础语句上没有太大区别。

我想学过几门编程语言的都有过这种体会,主要在一些语法细节上略有不同,有一楼贴出了for循环语句中变量初始化的不同,c++可以,c不可以,这算一个。这是对“区别”最最最基础的一层认识:语法细节。

2、往上一层,则是多出的语法,关键字。姑且可以认为是小特色。

语法的区别典型的头文件的不同以及名称空间的声明。这里会有和C一样的概念就是作用域,但是两者又有不同。还有就是新增new和delete的语法。在浩瀚的c代码中,遍地都是传递副本或者传递地址,而c++标新立异,多出了一个变量别名的概念,所以就有了按引用传递,实际上更深一点,就是指针的封装实现,而这些只不过是编译器做了你浑然不知而已。一个典型的例子就是auto和explicit关键字,它们体现的是c++显式和隐式转换的概念,但你无需关心怎么实现显式和隐式。

3、再往上,就和C相差越来越远了,重载和虚函数的概念,可以认为是大特色

一般说语言级别越高,程序员编程更方便,但编译器就会越多出许多额外的工作。可以说C++编译器就是劳模!经典的莫过于c++的重载和虚函数。这是和C完全不同的规定和机制,同名的函数你可以在C++代码中看到铺天盖地,各种操作符重载,各种虚函数声明,各种指针和引用的转换,让很多刚从C跳过来的小白望而生畏。

4、再往上,就是完全独立于C的概念,类,对象和继承。

在面向对象语言中类的概念很常见,但在C++也算是一个标签了,人们认为这是C和C++的最大不同,这是可以理解的,因为代码整体上这是最明显的区别。但不能认为这是“真正的区别”,这只是基于C的拓展。这里有一个实例化的概念,对象是类的实体,而这个实体包含了各种变量和函数,有了类对象就有构造函数,析构函数,复制构造函数以及友元函数的概念...有的人可能会想到结构体,确实两者有相似之处,但结构体却不能有成员函数,只能用函数指针,没有C++规范和方便。在实现上类才是对象编程的核心设计思想,它比结构体更能管理它的成员。有类就有权限和继承,什么公有,私有,保护,单继承,多继承,虚继承,父子类,基类派生类、、、单在继承方面,就比C复杂了好多好多还多!

5、再往上, 可以算接近“真正”的含义的区别了,那就是C++强大的独立特性 ,支持范式编程,如函数模板,模板类,怎么也想不到可以用模板来重用代码,个人觉得这是C++较之C比较伟大的地方!C++还有异常机制,这也是C++的一个特性,还支持元编程,以及强大的STL标准库、、、强大到那你怀疑人生,思考宇宙。。。

6、终极封顶!设计思想和应用场景的区别!

有一个很笼统的回答,就是C和C++的本质区别是面向过程和面向对象。这种回答看似没毛病,但是一看就知道水平不会有多高,应该是道听途说的“主流”看法,忽悠外行的还可以。用过这两门语言编程的人,不难体会,c可以实现面向过程,亦可实现类似的面向对象比如结构体封装,但用法上没有比真正有面向对象的C++高效和方便,只因为C++多了一个类的管理。而C++完全可以向下兼容C,即可以面向过程,也可以面向对象,我们常说C++是一种半面向对象的语言,但它完全可以面向过程。高级的系统编程,多线程,数据结构等等C++也可以做到,只不过出于执行效率和内存占用考虑,C的优势使它趋向于底层,如内核驱动和操作系统,越精简质量越高。对比C++,它更像是基于系统上的上层语言,可以做大型软件,界面开发,游戏开发等等等等。诚然,《C++ Primer Plus》中也说过,把C的繁杂的实现过程抽象成类型并且实例化来管理,是C++设计之初的动机,也就是OOP思想。用户可以自定义类型,并且可以不断往里面添加和拓展,必须修改的时候不需要大改全局,而只需要改局部,这就是OOP的优势之一。两者的侧重点会点不同,C更注重实现逻辑,C++更注重的是程序的整体设计,这就是常说的面向过程和面向对象,其本质还是在其设计思想上,C++更加开放和自由,代码维护和管理更加高效。

综上,我们不难看出,每一个设计细节都不是为了设计而设计,而是为了更好的的去编程而设计,而设计之后不一定在每个领域都占有优势,只能说设计者在设计过程中考虑的管理策略和应用场景不同!当然C++也因其复杂多样和不断迭代的标准遭人诟病,学习曲线陡峭。C入门不难,精通可能也不难,但是想精通C++,就是非常非常非常难!能用到什么程度,就表明对它掌握程度。甚至可以做到随意切换。用的多了,你甚至会认为这俩根本就不是同一门语言,又可以是同一门语言!就是那样一种境界!所以真正的区别的回答肯定会因人而异,可能就是取决于使用的人有几斤几两的区别了。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37864269/article/details/96034081

智能推荐

nginx+lua+GraphicsMagick生成实时缩略图-Permission denied问题_香酥蟹的博客-程序员宝宝

前言最近在完成nginx+lua+GraphicsMagick生成实时缩略图的过程,碰到很头痛的的问题。在nginx/logs/error.log文件中报错如下:sh: /usr/local/GraphicsMagick/bin/gm: Permission denied于是乎,便想尽一切办法,给能加和该加权限的目录和文件加上最高权限,但是依然还是报错,缩略图效果就是不出来。最终,摸索好久,还是找到问题所在。解决在nginx的conf文件中,修改nginx.conf# 第一行user roo

python获取项目根路径_流音寻帆_jonesky的博客-程序员宝宝

假设你的项目为myProject,myProject下有个data文件夹,里面存放tran.csv文件,import oscurPath = os.path.abspath(os.path.dirname(__file__))rootPath = curPath[:curPath.find("myProject\\")+len("myProject\\")] # 获取myProject...

中国石油大学《管理心理学(I)》第一次在线作业_chenjing-1125的博客-程序员宝宝

我的答案:A此题得分:2.5分39.(2.5分) 一个人能正确地认识自己是--成熟的标志。 A、社会化 B、个性化 C、经验化我的答案:A此题得分:2.5分40.(2.5分) 自我自觉对于个体的行为基本形态以及生活态度具有--的作用。 A、否定 B、一定 C、决定性我的答案:C此题得分:2.5分...

Json.net简单用法_iteye_11495的博客-程序员宝宝

参考:http://space.itpub.net/?uid-12639172-action-viewspace-itemid-470480这是一个C#、.NET解析JSON的框架官方:http://json.codeplex.com/Json.Net这个程序集可以帮我们很好的实现对象到json的转换。对于了解javascript的人来说json并不会很陌生,在现在很多...

HDU - 奔小康赚大钱(二分图最佳匹配+KM)_ityanger的博客-程序员宝宝

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Description传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。这可是一...

随便推点

PAT练习基础编程题目之求单链表结点的阶乘和_小仇哥的博客-程序员宝宝

求单链表结点的阶乘和导语:链表一直是我的弱项,做这道题做了比较久,程序本身不难,只是对指针的理解不到位,况且很久没有接触指针相关,遗忘了不少。风萧萧兮易水寒,壮士一去兮不复还。 - 本题要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。 - 函数接口定义: int FactorialSum( List L );typedef struct N

字节跳动面试(一面)_Phyllis57777的博客-程序员宝宝

一、背景  2019.9.16参加了我的第一个前端面试,投递的公司是字节跳动(上海),简历投出一周后被通知参加视频面试,以下为部分面试题。二、简答题flex布局怎样实现页面固定?容器属性flex-wrap:nowrap | wrap | wrap-reverseflex-direction:row | row-reverse | column | colu...

oracle与kafka连接池,Oracle GoldenGate对接 Oracle 11g和Kafka_圆圆0719的博客-程序员宝宝

使用system用户登陆oracle 的sqlplussqlplus "system/oracle" as sysdba首先检查oracle 是否已经开启Archive loggingarchive log list;如果显示以下错误,则证明没有开启ORA-01031: insufficient privileges用户可以使用以下命令查看oracle 是否已经开启了 自动归档模式select ...

页面嵌入Windows Media Player需要注意的_dengliuzhong1023的博客-程序员宝宝

在页面中插入WMP确实是个令人头疼的一件事。这里是WMP的版本ClassID,从WMP7后ID就成了clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6,之前的6.4为clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95,但是之前的版本还是可以用的,只不过新功能用不了罢了。下面这个是具体的版本号,你可以对比一下你现在...

java使用poi把从数据库中取出的数据写入到excel文件中并保存到指定文件路径_aijieshi3669的博客-程序员宝宝

  有时候我们要把从数据库中取出的数据导入到excel中,使取到的数据看起来更加的直观和方便,在java中如何实现取到的数据导入到excel中呢?以下就是使用poi工具吧数据写入excel文件中的解决方法:Excel表格扩展名有.xlsx和.xls两种格式 百度上对两种文件的介绍有很多就不一一列举,基本的不同总结下来有以下几点:  在java中读取和...

python课程循环(查找水仙花数练习)_LCY133的博客-程序员宝宝_python循环水仙花

三元运算符条件运算符在执行时,会先对条件表达式求值判断,如果判断结果为true,则执行语句1,并且返回结果;如果判断结果为false,则执行语句2,并且返回执行结果语法: 语句1 if 条件表达式 else 语句2举例:print('python') if True else print('java')a = 10b = 20print('a的值更大') if a>b else print('b的值更大')运算符优先级条件控制语句if 语句运算符条件运算符(三元运

推荐文章

热门文章

相关标签