首页 / 资讯中心 / 文章详情

【C++基础】命名空间与引用

【C++基础】命名空间与引用 ★ FEATURED ARTICLE
1.命名空间1.1命名空间的作用在C中如果在局部和全局变量中创建同名的一个变量那么调用的时候会优先调用局部变量而在C中要调用全局变量就需要用到命名空间了这也是C相对于C语言新增的功能如图所示同样的命名空间可以防止变量名和函数名字冲突可以看到由于rand在头文件stdio.h中已被定义所以调用会失败可以看到在命名空间中定义的变量就可以防止冲突。本质上来说命名空间是单独开出来的一个域来创建变量C中一共有四个域分别是函数局部域全局域命名空间域类域 域实际上是通过编译时对函数变量等进行隔离此外函数局部域和全局域还会影响变量的生命周期命名空间域和类域则不会影响所以在命名空间中的变量与头文件中的rand属于不同域所以调用时不会冲突命名空间只能定义在全局变量中并且可以进行嵌套定义。1.2命名空间的使用命名空间共有三种使用方法1.指定命名空间访问像这种方式 ::就是访问命名空间的操作符好2.用using展开命名空间中的指定成员3.直接展开整个命名空间(在项目中会不推荐此写法)2.C输出流c的输入输出流是类似于c语言中的printf/scanf函数的这里介绍三个常用的输出流:cout:类似于prinfcin: 类似于scanfendl:相当于换行符并且刷新缓冲区这三个函数都放在⼀个叫std(standard)的命名空间中与C语言不同的是这些输入/输出流可以自动识别变量的类型十分方便。,在C中被称为流插入和流体去运算符举个例子3.缺省参数与C语言不同C在定义函数时可以直接和函数的形参赋值如果在调用时没有给实参那么最后会直接使用默认的缺省参数可以看到调用函数时未传递实参编译器直接用缺省值计算缺省函数分为全缺省和半缺省全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。带缺省参数的函数调⽤C规定必须从左到右依次给实参不能跳跃给实参。intAdd(inta10,intb10,intc10)//全缺省intAdd2(inta,intb10,intc10)//半缺省intmain{cinAdd()endl;cinAdd(10)endl;}需要注意的是当函数声明和定义分离的时候必须在声明式就给缺省参数4.函数重载在c中同一作用域内是可以有同名函数的但要求函数的参数要不一样要么是类型不同要么是个数不同需要注意的是返回类型不同时不能算作函数重载1因此不算构成重载函数编译器此时也给出了报错5.引用5.1概念和定义引用相当于给变量起了一个别名与指针不同的是指针会创造额外的空间来储存地址而引用不会。5.2引用的特性引用的时候必须初始化这也是和指针不同的。一个变量可以有多个引用。一个引用也可以被引用。一个引用只能引用一个对象。5.3引用的使用引用的主要作用是引用传参和引用做返回值前者是为了改变引用的同时改变被引用对象的值类似于传地址后者则是为了减少临时变量的创建和拷贝以提高效率如上图所示假如返回类型为int那么在将值返回的过程中会创建临时变量导致效率变低如果返回类型是int 则说明返回的是一个引用并不会创建额外的变量并且在特殊场景中返回类型为引用还有特殊的作用例如取栈顶元素的过程如果用引用做返回类型那么就可以直接更改栈顶元素因为返回来的是栈顶元素的引用改变它就相当于改变栈顶元素十分方便但返回类型为引用时要注意一个问题假如想要引用的对象是在栈区上创建的那么这个对象出了函数就会销毁就会导致引用变成一个空引用类似于空指针5.4const引用被const修饰的变量也可以被引用只不过必须被const引用引用而const引用既可以引用普通变量也可以引用被const修饰的变量本质上是权限的放大缩小问题(权限可以缩小不能放大)权限放大时会报错权限缩小时编译器通过当原变量未被const修饰时它的权限是较大的因此它既可以被普通引用引用也可以被const引用引用当原变量被const修饰时假如它要被普通引用引用这是不行的因为原变量不可以被更改引用之后变成了可以被修改使权限放大了这是不行的还有两种特殊情况这两个报错其实根本上是同一个原因ab在被c引用的过程中会创建一个临时变量相当于这个临时变量被c给引用了而临时变量具有常量性必须在前面用const修饰第二个也是类似的e原本类型是double当要被d引用时因为d引用是int类型引用因此在引用的过程中会发生类型转换在类型转换的过程中同样也会创建临时变量临时变量具有常量性所以前面必须用const修饰5.5 引用和指针的区别引用不会创建空间指针会引用必须初始化指针可以不用初始化建议初始化,避免野指针引用只能引用一个对象指针可以改变它指向的对象在使用sizeof时指针的大小是取决于平台的类型的32位平台4个字节64位平台8个字节引用则取决于引用对象的数据类型引用可以直接访问对象指针需要解引用才能访问指针会经常出现空指针或野指针的情况引用则不会6内联函数内联函数和宏函数很像内联函数会在编译的时候展开函数宏函数则会在预处理的时候直接进行文本的替换展开函数可因为宏函数的使用很容易出现bug 所以c中新增了内联函数来替代宏函数我们先来回顾一下宏函数#defineAdd(a,b)(ab);#defineAdd(a,b)ab#defineAdd(a,b)(ab)以上均为错误写法!!!正确的写法为#defineAdda,b)((a)(b));综上所述宏函数写的时候时长会出现一些小bug因此我们可以改用内联函数⽤inline修饰的函数叫做内联函数编译时C编译器会在调用的地方展开内联函数这样调用内联函数就不需要建立栈帧了就可以提⾼效率。写法如下inlineintAdd(inta,intb){returnab;}还有一个很有意思的点为了避免程序员滥用内联函数即使你加上了inline如果编译器认为inline会导致消耗变多那么它并不会展开函数也就是说inline只是一个建议如果编译器认为你的建议不合理那么就不会听从你的建议所以尽量在遇到函数内部较简单并且此函数调用次数过多的时候推荐使用内联函数对于递归函数代码相对多⼀些的函数加上inline也会被编译器忽略。在debug模式下内联函数是默认不会展开的7nullptrnullptr和c语言中的NULL很像但是由于NULL经常会被直接替换成0所以c中有了新的关键字nullptr它只会隐式地转换为任意类型的空指针并不会转换为0因此可以避免想用指针时用到NULL的尴尬问题所以在c中一般都采用nullptr本篇文章到此就结束了希望能对大家有所帮助也希望大家多多指出文章的不足让我们一起进步谢谢大家观看
阅读完成 · 觉得有帮助?
咨询建站