C++和C的区别

C语言是面向过程编程,C++是面向对象编程

  1. 面向过程编程就是分析出解决问题的步骤,然后把这些步骤一步一步的实现,使用的时候一个一个的依次调用就可以了。
  2. 面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题步骤中的行为。
  3. 面向过程编程的性能比面向对象高,因为类调用的时候需要实例化,开销比较大,比较消耗资源。但是面向过程却没有面向对象易维护,易复用,易扩展。
  4. 编程的最终目的就是为了解耦和复用。由于面向对象编程有封装,继承,多态等性质,可以设计出低耦合的系统。

具体的几大区别

我们可以说,C++是C的超集,也可以说C是C++的子集。

我们都知道,C++编译器能够编译任何C程序,那么C和C++还有什么差别呢?

1、关键字和变量

C++相对与C增加了一些关键字,如下:
typename,bool,dynamic_cast,mutable,namespace
static_cast,using,catch,xplicit,new,virtual,operator,false,private template,volatile,const,protected,this,wchar_t,const_cast,public ,throw,friend,true,reinterpret_cast,try等等。

在C++中还增加了bool型变量和wchar_t型变量:
1.布尔型变量是有两种逻辑状态的变量,它包含两个值:真和假。
如果在表达式中使用了布尔型变量,那么将根据变量值的真假而赋予整型值1或0。要把一个整型变量转换成布尔型变量,如果整型值为0,则其布尔型值为假;反之如果整型值为非0,则其布尔型值为真。布尔型变量在运行时通常用做标志,比如进行逻辑测试以改变程序流程。

2.C++中还包括wchar_t数据类型,wchar_t也是字符类型,但是是那些宽度超过8位的数据类型。许多外文字符集所含的数目超过256个,char字符类型无法完全囊括。wchar_t数据类型一般为16位。

2、标准输入输出流

在C语言中,输入输出是使用语句scanf()和printf()来实现的,而C++中是使用类来实现的。
cin,cout,endl都是对象。
注意:它们本身并不是C++语言的组成部分。虽然他们已经是ANSI标准C++中被定义,但是他们不是语言的内在组成部分。在C++中不提供内在的输入输出运算符,这与其他语言是不同的。输入和输出是通过C++类来实现的,cin和cout是这些类的实例,他们是在C++语言的外部实现。

3、函数参数问题
  1. 函数形参不用变量名 声明函数时可以包含一个或多个用不到的形式参数。这种情况多出现在用一个通用的函数指针调用多个函数的场合,其中有些函数不需要函数指针声明中的所有参数。 比如:
​​​ 
int fun(int x,int) //注意不同
{
return x*2;
}
  1. 函数的默认参数
    C++函数的原型中可以声明一个或多个带有默认值的参数,也就是支持参数缺省。
    如果调用函数时,省略了相应的实际参数,那么编译器就会把默认值作为实际参数。
    具体请看博文(​​这里写链接内容​​)
4、函数重载

在C++中,允许有相同的函数名,不过它们的参数类型不能完全相同,这样这些函数就可以相互区别开来。而这在C语言中是不允许的。
关于重载具体请看博文(​​这里写链接内容​​)

5、变量作用域
  1. C++语言中,允许变量定义语句在程序中的任何地方,只要在是使用它之前就可以;而C语言中,必须要在函数开头部分。
  2. 而且C++允许重复定义变量,C语言也是做不到这一点的。
    eg:

#include<iostream>
using namespace std;
int a;

int main()
{
cin >> a;
for(int i = 1;i <= 10; i++) //C语言中,不允许在这里定义变量
{
static int a = 0; //C语言中,同一函数块,不允许有同名变量
a += i;
cout<<::a<<a<<endl;
}
return 0;
}

6、new和delete运算符

在C++语言中,仍然支持malloc()和free()来分配和释放内存,同时增加了new和delete来管理内存。
关于内存分配的知识请看博文(​​这里写链接内容​​)

7、引用型变量
  1. 在C++中,引用是一个经常使用的概念。引用型变量是其他变量的一个别名。
    比如:
    先声明一个名为a的变量,它还有一个别名b。我们可以认为是一个人,有一个真名,一个外号,以后不管是喊他a还是b,都是叫他这个人。同样,作为变量,以后对这两个标识符操作都会产生相同的效果。
  2. 引用的初始化
    和指针不同,引用变量的值不可改变。引用作为真实对象的别名,必须进行初始化,除非满足下列条件之一:
    (1) 引用变量被声明为外部的,它可以在任何地方初始化
    (2) 引用变量作为类的成员,在构造函数里对它进行初始化
    (3) 引用变量作为函数声明的形参,在函数调用时,用调用者的实参来进行初始化
  3. 作为函数形参的引用
    引用常常被用作函数的形参。
    以引用代替拷贝作为形参的优点:
    (1)引用避免了传递大型数据结构带来的额外开销
    (2)引用无须象指针那样需要使用*和->等运算符
  4. 以引用方式调用
    当函数把引用作为参数传递给另一个函数时,被调用函数将直接对参数在调用者中的拷贝进行操作,而不是产生一个局部的拷贝(传递变量本身是这样的)。这就称为以引用方式调用。把参数的值传递到被调用函数内部的拷贝中则称为以传值方式调用。
  5. 以引用作为返回值
8、try/catch/throw异常处理机制

异常处理基本思想:
执行一个函数的过程中发现异常,可以不用在本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接处理这个问题。
C++异常处理机制由3个模块组成:try(检查)、throw(抛出)、catch(捕获)
抛出异常的语句格式为:throw 表达式;如果try块中程序段发现了异常则抛出异常。
如下:

try 
{
可能抛出异常的语句;(检查)
}
catch(类型名[形参名])//捕获特定类型的异常
{
//处理1;
}
catch(类型名[形参名])//捕获特定类型的异常
{
//处理2;
}
catch(…)//捕获所有类型的异常
{
}

9、字符串变量和字符串类

在C++中提供了string类,用string类可以定义字符串变量。
字符串变量可以直接用“=”赋值,也可以相互赋值,同时支持对字符串的某一个字符赋值。
eg:

string word = ” china”; 
word[2] = ‘a’;

所以,C++对字符串的处理方法有两种:
1.字符数组,称为C—string方法
2.用string类定义字符串变量,称为string方法

10、内置函数(也叫内联函数)

内置函数在声明及定义时函数名前要加inline作为内置函数的标志。
C++中使用内置函数会提高程序的效率,但同时会增加程序的长度,在每次调用内置函数的时候,编译系统都会复制内置函数的代码并插入程序中,增加了程序的长度、
同时,C++规定内置函数中不允许有复杂的控制语句,例如循环语句及switch语句 ,只有那些规模较小而又频繁调用的简单函数,才适合被声明为内置函数。