目录
前言:
一、C++关键字:
二、命名空间:
三、C++输入和输出:
四、缺省参数:
五、函数重载:
六、引用:
常引用:
编辑引用和指针的区别:
引用和指针的不同点:
总结:
今天开始我们就进入C++学习。C++是在C的基础上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程方式等等。所以说C++跟C语言有很大的关系,一般情况下学C++前都需要先学C语言。可以说C++就是补充了C语言语法的不足之处。
C++一共有63个关键字,C语言32个关键字,也就是说C++在C语言的基础上多了一倍的关键字。
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
命名空间是为了防止自己的命名与C/C++库中名称相同而不能适用,有了命名空间后,以前不能在C语言中使用的名称可以命名空间中使用,要访问只需要在前面加上域作用限定符即可。当然,关键字是不能使用的即使在命名空间也不可。
而要解决上面这个问题,就要用到命名空间。也就是定义一个域:
上面使用的::是域作用限定符。
命名空间也支持嵌套:
namespace zxx
{
int rand=1;
namespace zxx1
{
int y=1;
}
}
在C语言学习中,我们就知道全局变量和局部变量相同时,编译器会优先访问局部变量,也就是编译器访问顺序是局部域—>全局域。而当我们指定域之后,编译器就会到我们指定域内去找。
在同一个工程中允许存在多个相同名称的命名空间,编译器最后会把他们合成一个命名空间中。一个命名空间就是定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
命名空间使用方法不单单只有一种方法,还有另外两种方法:
在使用using将命名空间中的某个成员展开:
namespace zxx
{
int rand=1;
int a=2;
}
using zxx::a;
int main()
{
printf("a=%d",a);
return 0;
}
//这时便可以访问到a,但是无法访问到y;
使用using namespace展开一整个域:
namespace zxx
{
int rand=1;
int a=2;
}
using namespace zxx;
int main()
{
printf("a=%d",a);
printf("y=%d",y);
return 0;
}
//这时zxx整个域的内容都可以访问到;
std是C++标准库的命名空间名,C++将标准库的定义实现都放在这个命名空间中。
①.使用count标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含
②.cout和cin是全局得流对象,endl是特殊得C++符号,表示换行输出。
③.<<是流插入运算符,>>是流提取运算符;
④.使用C++输入输出更方便,不需要像printf和scanf自己控制变量类型,cout和cin可以自动识别变量类型。
缺省参数就是声明或定义函数时为函数得参数指定一个缺省值,如果你再调用这个函数时没有传参,那么这个函数得参数就是缺省值,如果你调用时传参了,那么这个函数得参数值就是你所传参数的值。
缺省参数又可分为全缺省和半缺省,全缺省指的是:函数的每个参数都给了缺省值,半缺省就是函数参数只给了个别的缺省值。
ps:①半缺省参数必须从又往左一次给,不能间隔给;
②.缺省参数不能再函数声明和定义中同时出现;
③.缺省值必须是常量或者全局变量。
函数重载是函数的一种特殊情况,C++允许在同一个作用域中声明几个功能类似且函数名相同的函数,这些同名函数的形参不同(参数个数,类型,类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
第一种:参数顺序不同
第二种:参数个数不同
ps:函数返回值不同不能作为重载函数。
C++中的引用非常好用,可以避免我们在C语言中使用一二级指针等等,引用不是重新定义一个变量,而是给这个变量起一个别名,他和他引用的变量在同一个空间地址。
如上图,b就是a的引用,也就是a的别名,我们可以看到它们两个的地址是一样的,也就是说他俩指向同一块空间。而且引用类型一定是和引用实体是同种类型的。
如上图,a++后b也跟着++了,然后我让b++之后a也跟着++了,也就证明k就是a,a就是b;
在C语言阶段,我们要交换两个变量的值需要传地址,现在只需要用引用就可以了。
ps:
①.引用在定义时必须初始化;
②.一个变量可以有多个引用;
③.引用一旦引用一个实体,再不能引用其他实体。
引用不单单用于刚刚swap函数中做参数,引用还可以做返回值:
我们都知道当函数结束需要返回的时候会创建一个临时变量去接收返回值,然后销毁函数栈帧,那么在创建临时变量的过程中无疑会浪费空间,我们发现当一个变量是静态的或者是动态,函数结束时不会销毁的, 那么我们就可以用引用返回,这样就避免了空间的浪费。
从上图我们可以看到ay是我们创建的结构体对象,这个对象在main函数结束之后才会销毁,那么像以前C语言那样,每次函数返回一个值就需要开一个临时变量去接收返回值很浪费空间,既然这个变量在函数调用后没有被销毁那么就可以直接返回自己,所以在上图中我们使用了引用作为返回值。
用引用的好处:①减少拷贝;②调用者可以修改返回对象。
ps:引用返回仅限于函数栈帧销毁后还存在变量,返回值如果被销毁就必须传值返回。
为什么我们不能去引用const修饰的变量呢?
这是因为指针和引用,在赋值或初始化的时候权限只能缩小或者平移,不能放大。 本来a的权限仅仅是制度,结果在引用的时候给b可读可写的权限了。
上图报错的原因是ADD函数的返回类型为传值返回,传值返回返回的是临时变量,由于临时变量具有常性,所以我们必须加上const。
在语法概念上引用就是变量的别名,没有独立空间和其引用实体公用一块空间。而底层实现上是有空间的,因为引用就是按照指针的方式实现的。
从上图我们可以看到int& b=a和int* p=&a的反汇编实现是一样的,这也可以证明引用是按照指针的方式来实现的。
①引用概念上是定义一个变量的别买那个,指针存储一个变量地址;
②引用在定义时必须初始化,而指针可以不初始化;
③引用在初始化引用一个实体后便不可再去引用其他实体,而指针可以在任何时候指向任何一个同类型的实体;④没有后空引用,但是有空指针;
⑥引用自加就是其引用实体自加,而指针自加是指针往后偏移一个类型大小;
⑦有多级指针,但是没有多级引用;
⑧访问实体的方式不同,指针需要显示解引用,引用由编译器自动处理。
⑨引用比指针使用起来相对更安全
本次讲解的都是从C语言过度到C++所改进的一些东西,这些东西更加偏向于语法,可能会有点抽象,需要大家反复理解。