尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

C++从命名空间/缺省参数/函数重载引用/内联函数入门

C++从命名空间/缺省参数/函数重载引用/内联函数入门 C学习内容C语法STL数据结构C发展历史重要节点C11C20C特性编译器vsg[linux],clangC语法命名空间namespace存在意义变量函数类的名称都存在于全局作用域中可能会导致冲突。所以使用namespace关键字对标识符的名称进行本地化。namespace的定义namespacefun//(名字){intrand5;//内容可以是变量函数类型}namespace的说明namespace本质是一个域和全局域各自独立不同的域可以定义同名变量C中域有函数局部域全局域命名空间域类域域影响编译时语法查找变量/函数/类型出处没有指定域先局部再全局指定域直接去这个域局部域和全局域影响出处和生命周期命名空间域和类域不影响生命周期namespace只能定义在全局可以嵌套定义项目工程中多文件中定义的同名namespace会被认为是一个namespace不会冲突自动合成为一个C标准库都放在一个叫std的命名空间中实际项目中不能一下全包#includeiostreamnamespacemy_name{namespacemy_friend{intage18;}namespacemy_family{intage40;}inta5;intmain(){cout::aendl;//全局域为空格coutmy_name::my_family::ageendl;}}namespace的使用编译器默认只会在局部或全局域查找所以我们要使用命名空间中的定义有三种方式指定命名空间访问项目中推荐使用using将命名空间中某个成员展开项目中经常访问不存在冲突使用展开命名空间中的全部成员风险太大usingmy_name输入输出iostream 是标准的输入输出流库iostream间接包含printf和scanf(vs中是这样stdcin是istream类的对象是标准输入流stdcout是ostream类的对象是标准输出流stdendl是一个函数流插入输出时相当于插入一个换行字符加刷新缓冲区要通过namespace的使用方法用std是流插入运算符是流提取运算符关键在于该流能更好的支持自定义类型对象的输入和输出例如结构体可以直接输出整个结构体printf需要指定格式原生定义类型C的输入和输出可以自动识别变量类型本质是通过函数重载实现缺陷是可能在竞赛中影响效率缺省参数默认参数定义声明或定义函数时为函数的参数指定一个缺省值全缺省 全部形参给缺省值半缺省部分形参给缺省值实参从左往右传连续形参从右往左传连续 意义减少歧义应用开辟已知大小的空间方便阅读函数声明和定义分离时缺省参数不能同时在函数声明和定义同时出现规定必须函数声明给缺省值函数重载多态C支持同一作用域中出现同名函数但是要求同名函数的形参不同参数个数或类型不同与返回值无关注有些情况调用有歧义编译器不知道调用谁(避免voidf1(){coutf()endl;}voidf1(inta){coutf(int a}endl;}引用概念给已经存在的变量取别名不是定义新变量用法类型 引用别名引用对象intba;intx20;bx;引用不会改变指向所以这里是把x赋值修改a和b没有改变变量地址的概念引用功能1做函数形参修改形参影响实参引用功能2做函数形参减少拷贝提高效率结构体voidswap(intp1;intp2){inttempp1;p1p2;p2temp;}intmain(){intx1,y2;swap(x,y);}引用传参跟指针传参功能类似引用传参更方便一些互不可替代传引用返回intSLAt(SLsl,inti){assert(isl.size);returnsl.a[i];SLAt(s,i)1;}4.值返回临时变量拷贝具有常性5.引用功能3引用做返回值类型修改返回对象6.引用功能4引用做返回值类型减少拷贝提高效率注意不适当的引用返回可能造成野引用这样写不安全返回ret别名不安全ret是局部对象func结束ret就销毁的了返回他的别名本质也是一种类似野指针的行为引用的特性引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体再不能引用其他实体引用不能改变指向所以在链式结构中无法代替指针这种场景必须使用指针const引用指针和引用涉及权限缩小和放大权限不能放大权限可以缩小//权限不能放大普通引用不能绑const变量constinty1;intr2y;//报错//普通引用不能绑定常量const引用可以constintr2y;//通过//const引用可以接受普通变量常量表达式临时值intx0;constintr3x;//不能通过const引用修改数据inta10;constintra;r20;//报错const引用只读const引用可以存临时变量临时变量具有常性需要使用const引用类型转换时需要临时对象引用和指针的关系在C中指针和引用二者的功能具有重叠性二者相辅相成但是各自又有各自的特点都是无法替代的。对比项目引用指针空间不开开初始化必须非必须是否可修改否是怎样访问对象直接访问解引用sizeof含义引用类型大小地址空间所占大小inline内联函数inline修饰的函数C编译器在编译时会在调用的地方展开内联函数代码原地展开无函数调用无栈帧可以提高效率编译器不一定百分百内联递归大函数仍会建栈帧inline适合频繁调用的短小函数(否则内存太大inline的目的是替代宏函数(宏函数实现很复杂很容易出错vs的debug版本默认不展开inline需要设置inline不建议声明和定义分离到两个文件分离会导致链接错误inline被展开就没有函数地址链接时就会报错inlineintadd(intx,inty){returnxy;}intmain(){intretadd(1,2);}nullptr使用的目的解决C/C中的NULL存在的问题nullptr是一个特殊的关键字是一种特殊类型的字面量在C11中引入作用可以转换成任意其他类型的指针类型优点使用nullptr可以避免类型转换的问题因为nullptr只能被隐式转换为指针类型而不能被转换为整数类型
返回列表