美文网首页
C++与C语言的区别

C++与C语言的区别

作者: anycedo | 来源:发表于2019-08-23 19:48 被阅读0次

    一、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语言的区别
    鸵鸟不是鸟,圆不是椭圆问题
    多态
    静态多态——泛型编程

    相关文章

      网友评论

          本文标题:C++与C语言的区别

          本文链接:https://www.haomeiwen.com/subject/lsttectx.html