1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C语言的基础上进
行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。
语言的发展就像是练功打怪升级一样,也是逐步递进,由浅入深的过程。
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 [1]
C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
C++历史版本:
C++标准第一版,1998年发布。正式名称为ISO/IEC 14882:1998。
C++标准第二版,2003年发布。正式名称为ISO/IEC 14882:2003。
C++标准第三版,2011年8月12日发布。正式名称为ISO/IEC 14882:2011。
C++11对容器类的方法做了三项主要修改。
首先,新增的右值引用使得能够给容器提供移动语义。其次,由于新增了模板类initilizer_list,因此新增了将initilizer_list作为参数的构造函数和赋值运算符。第三,新增的可变参数模板(variadic template)和函数参数包(parameter pack)使得可以提供就地创建(emplacement)方法。
C++标准第四版,2014年8月18日发布。正式名称为ISO/IEC 14882:2014。
C++14是C++11的增量更新,主要是支持普通函数的返回类型推演,泛型 lambda,扩展的 lambda 捕获,对 constexpr 函数限制的修订,constexpr变量模板化等。
下面来谈一下C++中的基本知识
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的
形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。
简单来说就是同样的函数明,不同的作用,下面就看看函数重载的例子
#include
using namespace std;
int add(int a, int b, int c) //3个参数
{
return a + b + c;
}
int add(int a, int b)//2个参数
{
return a + b;
}
int add(char a, char b)//参数类型为char
{
return a + b;
}
int main()
{
char x = 'a';
char y = 'b';
int a = 5;
int b = 10;
int c = 20;
cout << add(a, b, c) << endl;
cout << add(a, b) << endl;
cout << add(x, y) << endl;
return 0;
}
可以看出3个函数名字相同但是参数类型参数个数不同,这就是函数的重载
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该
默认值,否则使用指定的实参。
#include
using namespace std;
int add(int a = 20, int b = 10)
{
return a + b;
}
int main()
{
int a = 5;
int b = 10;
cout << add() << endl;
return 0;
}
我们可以看到调用函数的时候并没有传入函数的参数但是没有出错,因为我们在给函数的参数给定了默认值,如果不传入参数则按默认值计算。这就是缺省参数
但是需要注意的是默认值只能在函数的声明和定义同时出现, 半缺省参数必须从右往左依次来给出,不能间隔着给。
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它
引用的变量共用同一块内存空间。
我们简单说一下引用的例子
#include
using namespace std;
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int a = 5;
int b = 10;
cout << "a: " << a << " " << "b: " << b << endl;
swap(a, b);
cout << "a: " << a << " " << "b: " << b << endl;
return 0;
}
程序运行之后我们发现a和b的值发生了交换,但是我们并没有传a,b的地址我们使用的是传值操作,
发生改变的原因就是我们在参数上使用了引用,此时就相当于给传进来的参数取了小名,但是其实操作的空间还是a,b的空间,所以a,b的值发生了改变,这就是引用。
引用的特性:
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
那么引用和指针有什么不同呢?
1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型
实体
3. 没有NULL引用,但有NULL指针
4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占
4个字节)
5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全