一.命名空间namespace
为了解决命名冲突问题(例如:自己定义的变量名等与库里面的冲突 当自己写的代码与他人的代码结合时,与他人命名的变量名冲突等等),引入了命名空间这个概念;
namespace的用法
用法:
关键字namespace + 命名空间的名字 + { } ({ }中即为命名空间的成员)
注意:{ }后不加分号
(如上图)
其中:GOTXX 是这个命名空间的名字,{ }里面的是命名空间的成员;
值得注意的是:
namespace 里面不仅可以定义一些变量,还可以定义一些函数,结构体等等
当需要访问该命名空间里面的变量时,需要加 域作用限定符 ::
其中注意 访问结构体时 限定符的位置;(加在struct后面)
例如:
注意:
1.如果不加 域作用限定符(::)时,默认的是在全局中去找,不会进入到命名空间域中去找;
2.同一个文件或则多个文件的多个位置的同名的命名空间编译器会把他们合成一个命名空间;
命名空间的嵌套
例如:在GOTXX1里面嵌套GOTXX2,GOTXX3 ……等等
嵌套后的使用:
命名空间的展开
展开分为 1.将整个命名空间展开
2.将一个命名空间里面的部分成员展开
用法:
1. 全部展开 using namespace + 需要展开的命名空间的名字
2. 部分展开 using 命名空间的名字 + 域作用限定符 + 需要展开的命名空间的成员的名字
展开后的作用:
即访问该命名空间的成员时,可以不用加域作用限定符;
展开的含义:可以理解为如果把命名空间比作一堵墙,展开即去掉这一堵墙,不需要用域作用限定符去指定;
例如:
std :
std是c++的标准库的命名空间,c++将标准库的定义和实现都放在这个空间中,里面包含了许多经常使用的关键词,如果将其全部展开,会很危险,所以可以将经常使用的std里面一些成员部分展开
C++的输入输出
与c语言类似,c++使用输入输出时也需要包含头文件;
输入输出流 <iostream>
cout 的用法
用法:
关键字cout + << + 需要打印的变量名
cout与C语言种的 printf 有一样的作用;
其中:printf在打印的时候需要指定类型(如%d %c 等等),但是cout可以自动识别类型;
在使用cout的是时候,需要用一个 流插入符号 <<;
因为cout在c++中与C语言中printf一样,需要经常使用,所以可以将其展开,就不用每次都指定命名空间;
如图:
在c++中,换行用 endl,endl 是也是std中的一个关键字,使用时可以将其展开;
也可以使用C语言中 '\n' 进行换行;
如例:
cin 的用法
用法:
关键字cin + >> + 需要打印的变量名
cout与C语言种的scanf一样,有输入的作用;
其中:scanf在输入的时候需要指定类型(如%d %c 等等),但是cin可以自动识别类型;
在使用 cin 的是时候,需要用一个 流提取符号 >>;(与cout中流插入<<是反的)
因为cin在c++中也需要经常使用,所以可以将其展开;
如图:
缺省参数
缺省参数的概念:
缺省参数是定义或则声明一个函数时,为函数的参数指定一个缺省值,在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参;
缺省参数的用法
例如:
半缺省参数
注意:
半缺省参数只能从右往左一次给出,不能间隔着给,因为这样在传参会有歧义;
缺省参数不能在函数的声明和定义中同时出现,也不能在定义中给,应在声明中给;
(因为在声明和定义中都出现了缺省参数,刚好两个位置提供的值不同,那么编译器无法确定用哪一个缺省值);
缺省参数必须是常量或则全局变量;
c语言不支持缺省参数(编译器不支持);
函数重载
函数重载的概念
函数重载:是函数的一种特殊情况,c++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参(参数个数,类型(不是变量名),或则顺序)不同,函数返回类型可同可不同,常用来处理实现功能类似数据类型不同的问题;
函数重载的例子
例如:
为什么C语言不支持函数重载?
因为不同语言的函数名修饰规则不同,C语链接函数地址时,就用函数名去找,在C语言中,函数名就是函数名,没有被修饰,所以当两个函数的函数名相同时就会有歧义;
而在其他的语言中,函数名的修饰可能会与函数的参数等有关,比如linux中的函数名修饰规则是_Z+函数名的大小+函数名+参数首字母;这样在链接函数地址时,虽然函数名相同,但是参数等不同,同名函数就不会有歧义;
引用
引用的概念
引用不是定义一个新变量,而是给已经存在的变量取一个别名,编译器不会为引用变量开辟空间空间,它和它引用的变量共用同一块空间;
用法:
类型 + & + 引用变量名 = 引用实体;
例如:
int a = 0;
int& b = a; // b就是对a的引用
b = 10; // b改变,a也改变
引用特征
1.引用在定义时必须初始化;
2.一个变量可以有多个引用;
3.引用一旦引用一个实体,再不能引用其他实体;
常引用
如果引用某个实体,不是想要修改这个它,就可以用常引用,前面加个const
其中,注意:
只有指针和引用才会有权限的放大和缩小,值拷贝不存在;
只有类型转换时才会产生临时变量,传值传参,传值返回要生成拷贝;
引用的作用
1.做参数
2.做函数返回值
传值返回
传引用返回
用引用返回的条件:
出了函数作用域,返回值就销毁了,不能用引用返回,否则返回值是不确定的;
即出了函数作用域,返回值没有被销毁,就可以用引用返回;
例如:
指针和引用的不同点
1.引用在概念上是给已经存在的变量取一个别名,指针存储的一个变量的地址;
2.引用在定义的时候必须初始化,指针没有要求;
3.引用在初始化的时候引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向一个同类型实体;
4.没有NULL的引用,但有NULL指针;
5.在sizeof中含义不同,引用的大小为引用类型的大小,但是指针始终是地址空间所占字节数(4/8字节)
6.引用自加即引用实体增加1,指针自加即指针向后偏移一个类型的大小;
7.有多级指针,但是没有多级引用;
8.访问实体方式不同,指针需要解引用,引用编译器自己处理;
9.相对而言,引用比指针使用起来更加安全;
内联函数
概念:
以inline修饰的函数叫做内联函数,编译时c++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的消耗,可以提升程序运行的效率;
内联函数的特性
1.inline 是一种用空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数的调用;
缺陷:可能会使目标文件变大;
优势:少了调用的开销,提高程序运行的效率;
2.inline 对于编译器而言只是一个建议,至于会不会展开是编译器自己决定;
3.inline 不建议声明和定义分离,分离会导致链接错误,因为inline会在.h文件展开了,没有函数的地址,链接时找不到函数地址;如果声明和定义分离了,只能在定义的.cpp文件中使用;
auto关键字
auto可以自动识别类型,作用是:当定义一个类型很长的对象时,用auto比较方便;
比如:
int a = 20;
auto b = a; //自动识别b为int
auto b; //这种写法错误的,使用auto时必须初始化
插入新知识:
打印类型用:typeid(变量名).name
例如:
int c =10;
cout<<typeid(c).name;
注意:
1.auto不能作为函数的返回值和参数;
2.auto不能用来定义数组;
3.auto必须初始化,不然不能推导出类型;
基于范围的for循环
范围for的语法