说起C++,想必大家的第一印象就是难,没有几个人敢把精通C++作为自己的一个目标,但是既然选择了学习这门语言,不求可以多么精通,至少应该在自己的能力范围内深入的理解下去。它的学习一般分四个层次,一般人可以达到第二到第三个层次,这样在生活、工作中就已经完全够用了,当然了,如果你已经到了这两个层次的程度,也还是需要继续钻研的。
下面对C++及C++的一些特点进行介绍:
1.C++到底是一门怎样的语言?
我们都知道C语言是一种通用的程式语言,广泛用于系统软件与应用软件的开发,是以B语言为基础在贝尔实验室被设计开发出来的,而C++也是在贝尔实验室被实现出来的,起初的时候被叫做“C with Classes”,作为C语言的加强版出现。随后C++不断的增加新特性。虚函数、运算子多载、多重继承、模板、异常处理、RTTI、命名空间也逐渐被纳入标准。1998年ISO颁布C++的第一个国际标准ISO/IEC 14882:1998,现在的最新标准是ISO/IEC 14882:2014。
C语言几乎是C++的一个子集,所以C语言支持的语法在C++基本都支持,而C++又在C语言的基础上增加了很多新的特性。
2.为什么C++支持重载?C语言不支持
重载:在同一个作用域内,一组函数函数名相同,参数不同(参数的个数、类型),这种现象称为函数的重载。
原因:C++函数名的修饰规则。
如下图所示,在函数编译链接的过程中,汇编完成后每个函数会生成一个符号表,用来存放函数名和函数地址(下图符号表中地址只是随便举的例子)便于函数调用,如果在main函数中对func函数进行调用,系统执行call命令,然后跳转至func函数处。在C语言中,函数的符号表里只存了函数名,若有多个函数重名,在调用过程中就会出现冲突,而C++则很好的解决了这个问题,C++语言中,符号表里除了函数名还存入了函数地址,当多个函数重名时,因为每个函数的地址是唯一的,调用函数可根据被调函数的地址准确的找到被调函数,从而实现调用。
3.缺省参数
C++中支持缺省参数,即当调用一个带参函数时,若传入的参数不够或没有传参,被调函数可以用自己的参数列表对未传参的变量进行初始化,如下面代码所示:
#include<iostream> using namespace std; int add(int x1 = 1 ,int x2 = 2,int x3 = 3) { return x1+x2+x3; } int main() { cout<<add()<<endl; //1+2+3 = 6 cout<<add(2)<<endl; //2+2+3 = 7 cout<<add(4,5)<<endl; //4+5+3 = 12 cout<<add(4,5,9)<<endl; //4+5+9 = 18 return 0; }
注:缺省参数必须从从右往左缺省。
例如上面的add函数亦可以如下方式缺省:
int add(int x1 ,int x2 = 2,int x3 = 3)
int add(int x1,int x2 ,int x3 = 3)
int add(int x1 = 1,int x2 ,int x3 = 3)
或者不缺省:
int add(int x1,int x2,int x3)
但绝不能出现如下形式:
int add(int x1 = 1,int x2 = 2,int x3)
int add(int x1 = 1,int x2,int x3 )
4.命名空间
为了防止全局变量之间的命名冲突,C++语言语法中引入了命名空间来解决这一问题。命名空间相当于一个更加灵活的全局域,可以用花括号把全局的一部分括起来,并以关键字namespace开头为该空间命名,使用该变量时只需要指定变量的域名就可以了。如下:
namespace name1
{
int a = 0;
}
namespace name2
{
int a = 1;
}
name1::a = 3; //对name1区域中的a进行修改
name2::a = 4; //对name2区域中的a进行修改
其中"::"是作用域解析符
标准C++库中的所有组件都在一个被叫做std的命名空间中声明和定义,在采用标准C++的平台上使用C++库中的组件写一个using提示符,就可以使用库中所有成员:using namespace std;
若担心库中成员与自定义成员冲突,也可用域名解析符的方式访问库中的成员如:std::cout<<"hello world"<<std::endl。