C++与C语言的区别

一、C语言与C++的历史渊源

    C语言来自:

Algol 60->
CPL->BCPL(B=basic)->B语言(世界上第一个操作系统UNIX的母语)->
C语言(BCPL第二个字母)->UNIX系统基于C语言的重写->
C++,在C语言的基础上发明的,进一步扩充和完善了C语言->
Java、C#,在C++的基础上改写产生的。

二、C++与C语言的区别

    首先我们需要明白从C到C++到底扩充了什么。
    刚开始学C++的时候,萌新们就被灌上面向对象的四字迷药,说C语言是面向过程的,而C++是面向对象的。这就很显然了,C++与C语言最大的区别就是,C++你要摆个对象在你面前,才能开始进行你的骚操作,所以要学习C++,你的首要任务就是——找对象。全篇终。

图2.1 Fxxk Off

    恭喜有对象的你看到了这里。

    那么什么是面向过程呢?面向过程的方法其实与我们常人处理事务的思维类似:炒西红柿鸡蛋——准备材料、打火、下锅、翻炒、起锅完事。面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用即可。
    那什么是面向对象呢?对象是什么?万物皆对象。什么,万物皆对象,你也太重口味了。一个人是一个对象,大到大象,小到蚂蚁,都是一个对象。你的基友小胖,你的女神小美,你的闺蜜小丽,你的上司小明等等,如果他们都是人的话,我们又可以把这些对象进行一个抽象,归个类,就叫作人。(我竟然举不出来例子,理解的不透彻)

图2.2 重口味

图2.3 可恶,竟然有人想出了这么好的例子

    C语言是结构化的面向过程的语言,它主要考虑的是如何通过一个过程,对输入进行运算,得到输出。
    C++是面向对象的语言,C++首要考虑的是如何构造一个对象模型,让这个模型能够与要解决的问题相契合。

    面向过程的编程方法有着更好的性能,但是代码不易维护、不易复用、不易拓展。
    面向对象的编程方法易维护、易拓展、易复用,但是性能相对面向过程的方法要差一些。
    啥?对象都有了,你还问我牺牲这点性能值不值得?
    在程序规模较小的时候,C语言能够轻松应对,但是当程序的规模比较大的时候,C语言就很难受了。

    我个人觉得C语言和C++的绝大部分的区别都是由这两种不同的编程思想衍生出来的,C++添加或修改的新特性、语法规则和关键字都是为有对象的程序服务。

2.1 C++对封装、继承、多态的支持

2.1.1 封装——类

    封装就是,把之前我们说的小胖、小丽、小明等的各种属性来个并集,也即人的特性抽象出来,形成人这一个类,他们的大脸、尖脸、大头、小头等视为各自的固有属性,爱装x的小明的有特有的装x行为,爱打球的小胖有灵活的脚步行为等等。把这些属性和行为进行有机的结合,形成了一个通用类——人。
    在C++中,将对象进行抽象,定义其统一的属性和方法,形成一类,即完成了所谓的封装。
    封装的目的在于将对象的使用者和设计者分开,利用接口的机制隐蔽内部的实现细节,只留下接口给外接调用。封装的设计可以提高软件的可维护性和可修改性,还可以实现代码重用。

2.1.2 继承

    继承就是从已有类那里得到已有的属性和方法。比如有个手机类,然后这么多的牌子,那肯定要再手机类的基础上再进行细分。手机类作为基类,苹果手机、华为手机、三星手机等继承手机类,在手机类的基础上,发展他们自己的特色。
    同样的在C++中使用继承,可以使代码得到重用,子类也可在父类的基础上添加功能。

2.1.3 多态

    多态的方式有两种:静态多态、动态多态

    其中静态多态是编译器在编译期间完成的,包括函数重载泛型编程
    函数存在重载情况时,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数就调用,如果没有就报错了。

//add.cpp
int Add(const int left,const int right){
    return left+right;
}
char Add(const char left,const char right){
    return left+right;
}
float Add(const float left,const float right){
    return left+right;
}

    而重载存在一些问题:(1)重载不能解决所有函数的适应情况;(2)重载存在很多的重复代码,代码的复用率不高;
    C语言中也有一个解决方式就是宏定义,但是宏定义没有类型检测,代码的安全性不高,且宏不是函数,无法调试,如果在调用宏的语句中出现错误时,非常麻烦。

//Macro.cpp
#define Add(a,b) ((a)+(b))

    那C++还有一种静态多态的编程方式就叫做泛型编程模板是泛型编程的基础,模板又分为函数模板类模板。下面的代码展示的是一个函数模板,它的类型是T,在调用时,会检查输入实参的类型,检查的过程称作模板实参推演,推演可以决定T的实际类型,从而进行后续的处理。


//template.cpp
template<typename T>
T Add(const T& left,const T& right){
    return left+right;
}

    之后会单独开出一小节来具体介绍泛型编程。

    接下来介绍一下动态多态。它是在程序运行时,根据基类的指针指向的具体对象来确定具体应该调用哪个类的函数。动态多态的实现核心是虚函数,当然也肯定要拜继承所赐。
    同样的,之后会单独开出一个小节来介绍基于虚函数的多态实现。

2.1.4总结

    C++添加了类、类的继承、泛型编程、虚函数等机制来完成对封装、继承、多态支持,以实现面向对象的编程方法,这些都是C语言所没有的。

2.2 C++中独有的关键字

2.2.1 标准输入输出

    在C语言中,输入输出是使用语句scanf()printf()来实现的,而在C++中是使用类来实现的。

2.2.2 强制类型转换

    

2.2.3 动态分配内存

    

参考资料:

C语言的发展
面向过程——百度百科
面向对象——百度百科
C++与C语言的区别
鸵鸟不是鸟,圆不是椭圆问题
多态
静态多态——泛型编程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,089评论 1 32
  • C++类和对象 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心...
    863cda997e42阅读 634评论 0 4
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 4,988评论 0 14
  • 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架...
    半世浮华一生留恋阅读 1,550评论 1 2
  •     2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have ...
    jackfrued阅读 5,780评论 11 49