c语言与c++区别

来源:互联网 发布:雨露计划软件下载 编辑:程序博客网 时间:2024/06/11 03:15

C语言与C++区别:

  • C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)。
  • C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”。

对语言本身而言,C是C++的子集。《Effective C++》上说道,C++由四个部分组成: C、Object-Oriented C++、Template C++、 STL,即c语言、面向对象OOP、泛型编程(模板)、STL。


面向对象OOP

面向对象的三个基本特征是:封装、继承、多态

这里写图片描述


封装

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类的成员可以分为共有成员,私有成员,保护成员。在不考虑继承的情况下,保护成员与私有成员一样,都只能在类内部被访问;而存在继承的情况下,基类的保护成员根据继承的方式,相应地成为了子类的保护成员或私有成员,而基类的私有成员仍为基类的私有成员,子类无法访问基类的私有成员。


继承

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”。
被继承的类称为“基类”、“父类”或“超类”。
继承的过程,就是从一般到特殊的过程。
在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

对基类的继承方式有三种:共有继承、私有继承、保护继承。
(1)共有继承:基类的共有成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有;
(2)私有继承:基类的共有成员和保护成员在派生类中成了私有成员,其私有成员仍为基类私有;
(3)保护继承:基类的共有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。
ps:“其私有成员仍为基类私有”的意思是,基类的私有成员并没有成为派生类的私有成员,它仍然是基类的私有成员,只有基类的成员函数才能访问它,而不能被派生类的成员函数访问

在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。


多态

多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现接口重用。在C++中, 多态性体现在具有不同功能的函数可以使用同一个函数名,这样就可以通过一个函数名调用不同的函数内容。

实现多态,有二种方式,覆盖,重载。

  • 覆盖,是指子类重新定义父类的虚函数的做法。
  • 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

关于虚函数,最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。
比如下面的例子:

#include <iostream>using namespace std;class person{public:    void sleep()    {        cout<<"person sleep"<<endl;    }    virtual void get_up()    {        cout<<"person get up"<<endl;    }};class student:public person{public:    void sleep()    {        cout<<"student sleep"<<endl;    }    void get_up()    {        cout<<"student get up"<<endl;    }};void main(){    student ming;    person *ptr;    ptr = &ming;    ptr->sleep();    ptr->get_up();    ming.sleep ();    ming.get_up ();}

运行结果为:

person sleepstudent get upstudent sleepstudent get up

同样,如果将一个子类的指针指向一个基类的对象,也可以调用相应的虚函数。只是没有使用虚函数,则调用子类的函数。如上面定义的类,若main函数为:

person we;student *ptr;ptr = (student *)&we;ptr->sleep();ptr->get_up();

则结果为:

student sleepperson get up

泛型编程

STL

0 0
原创粉丝点击