1.前言
1982年,美国AT&T公司贝尔实验室的本贾尼博士在C语言的基础上引入并扩充了面向对象的概念,发明了—种新的程序语言。为了表达该语言与C语言的渊源关系,它被命名为C++。而本贾尼博士被尊称为C++语言之父。下面的图片就是C++的祖师爷!
先来给大家看一个简单的C++代码:
我们可以看到我们输出了一个hello world,但是和C语言不一样,接下来就给大家介绍上面的代码含义!
2.命名空间 namespace
1.namesapce是我们学习C++遇到的第一个关键字,后面跟命名空间的名字,接{},{}里是命名空间的成员,命名空间可以是函数,变量类型。
2.namespace本质上是定义一个域,我们定义的域和全局域互不干涉,不同的域可以定义不同的变量,互相独立
3.namespace只能定义在全局,也可以嵌套定义
4.一个命名空间可以在一个文件定义很多份,也可以在很多文件定义很多份,不同文件相同的命名空间它会自动合并,在逻辑上会当成一个
5.C++标准库都放在一个叫std的命名空间中
::域作用限定符 ,默认访问全局,想要访问指定的域只需要在::前加域名
针对命名冲突,我们来看一个例子
我们可以看到这里编译报错了,这是为什么呢?提示说rand不明确,rand被重定义了,在stdlib.h中rand是函数,在主函数又要打印rand的值,电脑不知道用哪个rand,所以出错,命名空间就可以很好的解决这样的问题!我们将rand放到一个域里,打印的时候去这个域当中找!这样就不会发生冲突的情况了
2.1命名空间的使用
编译查找一个变量的声明时,默认都是去局部或者全局查找,不会到命名空间当中查找,当我们要用命名空间的变量时有几种方式,下面我都会用代码来模拟一下:
1.指定命名空间访问,在项目推荐这种,这样比较麻烦
2.using将某个命名空间展开,项目中经常使用不冲突的推荐这种方式
3.展开全部,也就是展开std,项目不推荐风险大,我们在自己练习可以使用
3.C++输入输出
1.C++的输入输出需要包一个头文件<iostream>,io就是英文单词input,output的缩写,是标准的输入,输出流的库,定义了标准的输入输出对象
2.std::cin是istream类的对象,关于类是什么后面会有详细的讲解,这里可以暂且理解为结构体,主要面向窄字符的标准输入流
3.std::cout是ostream类的对象,主要面向窄字符的标准输出流
4.<<是流插入运算符,>>是流提取运算符
5.std::endl是一个函数,比较复杂,在我们初学可以理解他就是一个换行符,他的底层其实不是一个换行符,后面随着我们知识的增加可以更好的理解
6.C++的输入输出还是很方便的,相比于C,C++可以自动识别类型
4.缺省参数
1.缺省参数就是声明函数或者定义函数时为函数的参数指定一个缺省值,在调用函数时,如果·函数没有传实参就采用形参的缺省值,否则采用传的实参
2.缺省参数分为全缺省和半缺省,全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值,C++规定半缺省参数必须从右向左连续缺省,不能间隔跳跃!
3.带缺省参数的函数调用,C++规定必须从左向右传参,不能跳跃传参
4.函数声明和定义分离时,缺省参数不能再函数声明和定义同时出现,C++规定必须在函数声明给缺省值!
下列会通过代码来展示,可以结合理解:
5.重载函数
我们都知道C语言不支持同一作用域出现同名函数,C++支持在同一作用域出现同名的函数,但是要求这些同名函数的形参不同,参数个数可以不同,参数的顺序不同,类型不同,这样C++函数调用就表现出了多态的行为更加灵活!返回值不同不构成重载
还有一些坑的地方:
6.引用
1.引用就是给已经存在的变量取了一个别名,编译器不会开新的空间,引用和引用的变量共用一个内存空间
2.引用在定义时必须初始化
3.一个变量可以有多个引用
4.引用一旦引用一个实体,就不可以再引用另一个实体,不可以改变指向
6.1const引用
1.可以引用一个const对象,必须用const引用,也可以引用普通对象,权限可以平移,缩小,但是一定不能权限放大
2.表达式相加,函数传值返回,类型转换会产生临时变量,临时变量具有常性
6.2指针和引用的关系
1.语法概念上引用是一个变量的别名,不开空间,指针是一个变量的地址,要开空间
2.引用在定义时必须初始化,指针可以不初始化,但是一般建议初始化
3.引用在初始化引用一个对象后,就不可以改变他的指向,但是指针可以改变他的指向
4.引用就是变量的别名,所以可以直接访问指向的对象,指针需要解引用来访问对象
5.sizeof中含义不同,引用结果为引用的类型大小,指针始终是地址空间所占的字节个数,32位是4,64位是8
6.引用相比于指针更加安全一些,指针容易野指针,空指针,指针越界等问题,引用很少出现
7.inline(内联)
1.用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,可以提高效率
2.内联函数可以很好的替代宏函数,宏函数实现很不方便而且容易出错,宏函数也不可以调试
3.inline对于编译器只是一个建议,编译器不同情况各不相同,inline适用于频繁使用的短小函数,对于比较长的函数,递归,加上inline编译器也会自动忽略
4.inline不建议声明和定义在不同的文件,分离会导致链接错误,直接放到.h文件
8.nullptr
C语言当中的NULL其实是一个宏,在C++会出现一些歧义的问题
C++11引用了nullptr,是一个特殊关键字,她可以转换成任意类型的指针,使用nullptr定义空指针可以避免类型转化的问题,因为nullptr只能隐式的转化为指针类型,而不能转化为整数类型