核心内容摘要
“将78赛进13视频吃官方版”
一关键字auto关键字intmain(){inta0;intba;autoca;//根据右边的表达式自动推导c的类型autod
1
1;//根据右边的表达式自动推导d的类型//typeid()查看变量类型couttypeid(c).name()endl;couttypeid(d).name()endl;return0;}在这里似乎感觉到auto用处不大但是在后面遇到类型很长的时候auto的作用就变大了auto的局限auto不能作函数的参数auto不能直接用来声明数组小扩展(C11中来学习)范围for 语法糖intmain(){intarr[]{0,1,2,3,4,5,6};for(inti0;isizeof(arr)/sizeof(int);i)arr[i]*2;for(int*parr;parrsizeof(arr)/sizeof(arr[0]);p)cout*p ;coutendl;//范围for//适用于数组/容器//依次取数组中数据赋值给e//自动迭代自动判断结束for(autoe:arr){coute ;}coutendl;//修改数据for(autoe:arr){e*2;}for(autoe:arr){coute ;}coutendl;return0;}二命名空间命名空间Namespace是一个用于管理标识符如变量、函数、类等名称的技术目的是避免命名冲突。
命名空间通过将标识符组织到不同的空间中使得同一个标识符在不同的命名空间中可以共存。
#includeiostream//全局域inta0;// 域 命名空间namespace test{//局部域inta1;}intmain(){inta2;//域作用限定符:://该符号左边为空代表全局变量printf(%d ,::a);return0;}
命名空间中可以定义变量/函数/类型namespace test{//变量inta0;//函数intAdd(inta,intb){returnab;}//类型structNode{intval;structNode*next;}}
命名空间可以嵌套namespace A1{inta1;namespace A2{intb1;}}intmain(){printf(%d\n,A1::a);printf(%d\n,A1::A2::b);return0;}不同文件的同名的命名空间最后会整合在一起大家可以自己去创一些文件试一试。
当然嵌套也是可以解决命名冲突问题的。
命名空间的展开//局部域-全局域-展开了命名空间 or 指定访问命名空间域//展开命名空间 展开了就会去访问//展开命名空间就是编译器是否会在命名空间里去搜索using namespace test;//对于这样直接展开有时候在面对一些情况下不太好//或许会有西冲突的问题//当这种情况下我们可以把常用的展开//指定展开using std::cout;using std::end1;intmain(){couthello worldend1;}C 的输入输出#includeiostreamusing namespace std;intmain(){// 流插入运算符couthello world;//还可以多个intx1;couthello worldx;// 这是换行符 endl 当然 \n也是可以的couthello worldendlx;//cout有个好处自动识别类型//但是可能会丢失精度// 流提取运算符std::cinxd;}缺省参数#includeiostreamusing namespace std;//缺省参数//可以有多个参数从左到右依次传voidFunc(inta
{coutaendl;}intmain(){Func();//没有传参时使用默认参数Func(
;//传参时用指定参数return0;}
全缺省#includeiostreamusing namespace std;voidFunc(inta1;intb2;intc
{coutaendl;}intmain(){Func(
;Func(
;Func(1,2,
;return0;}
半缺省#includeiostreamusing namespace std;voidFunc(inta;intb;intc
{coutaendl;}intmain(){Func(
;Func(
;Func(1,2,
;return0;}注声明和定义不能同时缺省函数重载
概念函数重载是函数的一个特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数的个数/类型/类型顺序)不同常用来处理实现功能类似但数据类型不同的问题。
1类型顺序不同intAdd(inta,intb){coutint Add(int a, int b)endl;returnab;}doubleAdd(doublea,doubleb){coutdouble Add(int a, int b)endl;returnab;}intmain(){coutAdd(1,
endl;coutAdd(
1,
2.
endl;return0;}
2个数不同voidtest(){cout11endl;}voidtest(inta,intb){coutabendl;}
3类型顺序不同voidtest(chara,intb){coutabendl;}voidtest(inta,charb){coutabendl;}引用引用在定义的时候必须初始化一个变量可以有多个引用引用一旦引用一个实体就不能再引用其他实体intmain(){inta0;//将b作为a的别名intba;intcb;intda;coutaendl;coutbendl;coutcendl;intx1;//是将x的值赋给bbx;}引用的用法比起指针更加的好用但是无法完全替代指针作参数(输出型参数)作参数(提高效率) (大对象/深拷贝类对象)voidSwap(inta,intb){inttmpa;ab;btmp;}voidSwap(int*a,int*b){int*tmpa;ab;btmp;}intmain(){intx0;inty1;Swap(x,y);coutx yendl;int*pxx;int*pyy;coutpx pyendl;Swap(px,py);coutpx pyendl;return0;}引用作返回值(提高效率)引用作返回值 修改返回值 获取返回值intcount(){staticintn0;n;returnn;}intCount(){staticintn0;n;returnn;}intmain(){//会生成临时变量然后在给retintretcount();//引用作返回值就不会在生成临时变量return0;}传引用返回可以减少拷贝提高效率但是这里值得一提的是intCount(){intn0;n;returnn;}intmain(){intretcount();return0;}当写成上面的这种形式时去掉静态修饰ret 的结果就不一定了如果count函数结束栈帧销毁没有清理栈帧那么ret的值就是正确的如果count函数结束栈帧销毁清理栈帧那么ret的值就是随机的还有一种情况intCount(){intn0;n;returnn;}intmain(){intretcount();return0;}在这里又回到了引用的取别名用法当然上面的问题在这里依旧存在。
引用的
注意事项#includeiostreamusing namespace std;intmain(){//这里是错误的//引用过程中权限不能放大// const int a 0;// int b a;//可以没有放大权限d的改变不影响cconstintc10;intdc;//不可以//引用过程中权限可以平移或缩小//z不可以改变但x可以intx10;intyx;constintzx;x;//z;doubledd
1
11;intiidd;//类型转换时产生临时变量//const int rii dd;//这里给rii的是临时变量临时变量具有常性}指针和引用的区分intmain(){inta10;//语法层面不开空间对a取别名inta1a;a120;//语法层面开空间存储a的地址int*a2a;*a220;return0;}底层汇编指令实现的角度看引用是类似指针的方式实现的不同点:引用的概念上定义一个变量的别名指针是存储一个变量的地址引用时必须初始化指针没有要求引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向一个同类型实体没有NULL引用但是有NULL指针在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节 个数引用自加即引用的实体自加指针自加即指针向后偏移一个类型的大小有多级指针但是没有多级引用访问实体的方式不同指针需要显示解引用引用编译器自己处理引用比指针使用起来更加安全内联函数概念内联函数inlinefunction是 C 中的一种函数优化机制它允许编译器在函数调用的地方直接插入函数的代码而不是进行常规的函数调用过程。
这样可以减少函数调用的开销尤其是对于一些小型的函数它能够提高程序的执行效率。
//内联函数//适用于短小的频繁调用的函数//inline对于编译器只是一个建议最终是否成为inline编译器自己决定//