为什么要学习C++?
C++是对C语言的升级,或者说C++是对C语言的重新封装,所以说C++有着和C差不多高的效率,以及有着和C一样的灵活性。除此自外,C++还有着很强的抽象能力,并且也还有着很强的生产能力,不过在生产能力方面,跟广为人知的java语言还是有些差距的,但是这个差距在努力的减小。所以说C++基本上囊括了市面上主流编程语言的所有优点。比如java语言的高生产力,高抽象性;C语言的高效率以及高灵活性等优点。所以说,C++是一些列编程语言的结合体,拥有着各种编程范式。
什么是编程范式?
编程范式就是计算机编程的基本风格或典范模式。
C语言就是一种过程式;
C++就支持多种编程范式,比如过程式、基于对象(object-based)、面向对象、数据抽象式、模板编程式、函数式等等。
C++相对于C语言新增加的一些特性
bool类型
C++支持支持原生态的bool类型。其它的各种各样的布尔类型都是采用的宏定义的方式,我们在使用的过程中可能会出现一些意想不到问题。所以建议使用原生态的bool。
但是有人就会反问到,我们也可以在C语言中使用bool啊,bool怎么是C++中的新特性呢?
毋庸置疑,在C语言中我们是可以使用bool,但是我们还需要包含一个名字叫stdbool.h的头文件,这样我们才能够使用bool类型。
头文件
C++的头文件形式:iostream
C语言的头文件形式:stdio.h
由C语言继承过来的,符合C++标准的C语言标准头文件形式:cstdio
域运算符
域运算符的符号是::,即两个冒号来表示。域运算符可以指定访问某个命名空间的变量,是用来区分命名空间的,这样可以避免变量名的冲突。比如:
namespace aaa
{
int a = 10;
}
namespace bbb
{
int a = 20;
}
int main()
{
int c = aaa::a + bbb::a;
return 0;
}
我们定义了两个同样名字的变量a,但是这样不会出错,因为我们把这两个变量封装在了不同的明明空间中,我们只要通过命名空间和域作用符::就可以访问指定的变量了。
new和delete
在C语言中,申请堆上的空间时有malloc和free,而C++中有对应的new和delete对堆空间的操作。注意:malloc对应的一定是free,new对应的一定是delete。
有一点需要注意的是,new出来的变量和数组在释放的时候有所区别,
int *pArray = new int[10];
delete[] pArray;
上面是申请的数组,释放的时候一定要加上[]数组符号,如果不加[]这个符号,将会出错。
重载Overload
函数重载是C++相对于C的一个重要的新特性,函数重载说白了其实很简单,同一个函数名,由于参数的个数、类型、顺序不同而可以构成多个同名的函数,我们在调用的时候,编译器会根据我们传递的参数进行函数的匹配,表面上达到了一个函数实现了多种功能的效果.
命名粉碎机制
但是实际上,编译器对重载函数生成的不只是一个函数,事实上是有几个重载函数,就生成几个函数,我们可以说编译器使用了命名粉碎机制。这个机制是由C++编译器生成的。命名粉碎机制在我们自己的模块中使用重载函数显然是很好的,但是如果我们把我们的模块提供给别人来使用时,就会出现很多问题,由于命名粉碎机制,已经改变了原来的函数名,所以会导致找不到函数名。所以有时候,我们会避免C++的命名粉碎机制,会强制以C语言的方式进行编译,只要加上extern “C”{},就可以了。