保险资料网站有哪些,编程培训机构名字,景县网站建设,百度站内搜索的方法C(三)
1.引用
1.引用的概念 引用的概念:引用不是新定义一个变量#xff0c;而是给已存在变量取了一个别名#xff0c;编译器不会为引用变量开辟内存空间#xff0c;它和它引用的变量共用同一块内存空间。 引用的语法:类型 引用变量名(对象名) 引用实体 ;
例如:
#i…C(三)
1.引用
1.引用的概念 引用的概念:引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。 引用的语法:类型 引用变量名(对象名) 引用实体 ;
例如:
#includeiostream
using namespace std;
int main()
{int a 9;// 给变量a取别名int ra a;int* b nullptr;// 给变量b取别名int* rb b;cout ra endl;cout rb endl;return 0;
}注意: 引用类型必须和实体是同一类型. 实体是int*,那么引用类型也得是int*. 我们也能通过改变引用来改变实体本身的值.例如:
int main()
{int a 10;int ra a;cout a endl;ra 100;cout a endl;return 0;
}2.引用的特性 1.使用引用定义的变量必须要初始化. 例如: 2.一个变量可以有多个引用: 例如: 3.引用一旦指向了某一个变量,就不能在引用其他实体,也就是说,引用只能引用一个实体,不能同时引用多个实体.否则引用的值就会被改变 例如: 3.常引用
当我们写下这样的代码时,编译器就会报错: int a 0;,此时想引用一个常数时,就需要用到常引用了.
例如:(由于常量是不能被更改的,所以其引用应该也是不能被修改的,所以常量的引用应该也是不能被修改的,所以此时就应该为引用加上const来保证其实体不能被修改)
int main()
{const int a 0;//int a 0;这样写会报错return 0;
}假如这样写呢: double rb 10;编译报错! 如何修改:
int main()
{const double rb 10;cout rb endl;return 0;
}解释:由于10默认为int类型,而引用是一个double类型,所以在转换时,编译器会自动进行类型转化,而转化出的这个值相当于就是double类型的常量,用于赋值给double的引用,所以这里得要用常引用即可. 4.引用的使用场景
1.做参数
例如:交换两个数
void Swap(int a, int b)
{int tmp a;a b;b tmp;
}
int main()
{int a 10;int b 20;cout a b endl;Swap(a, b);cout a b endl;return 0;
}2.作为返回值
int Add(int a, int b)
{int ret a b;return ret;
}
int main()
{int a 10;int b 20;int ret Add(a, b);cout ret endl;//30Add(100, 200);cout ret endl;//300return 0;
}运行结果: 为何会出现这种状况呢? 因为ret是一个局部变量,是在Add函数的栈帧中创建的,当Add函数执行结束时,这ret变量的空间就被操作系统回收了,(注意:所谓的回收是指系统为这块空间打一个标记,有标记就说明这块空间是允许被覆盖的,当程序中有其他的需要申请空间的操作时,就会将有标记的空间中的内容给覆盖掉)但是这里并没有其他的需要申请空间的操作,由于两次调用期间,没有其他的需要申请空间的操作,所以当下一次调用ret函数时,就需要为这次Add调用的函数栈帧中的ret变量开辟的空间于前一次调用Add函数时的里的ret的空间是相同的,并将这块空间中的值赋值为300.所以外部ret引用的值又成了300. 由图可见,两次调用Add函数用的是内存中同一块空间. 传值调用就不会发生这种情况: 因为传值返回的返回值是值临时的拷贝,原来占据的空间会正常的被释放掉. double Add(double a, double b)
{double ret a b;return ret;
}
int main()
{double a 10;double b 20;double ret Add(a, b);cout ret endl;Add(100.0, 200.0);cout ret endl;return 0;
}结果:
总结: 注意如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用引用返回如果已经还给系统了则必须使用传值返回。 3.传值返回和传引用返回的效率比较 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 总而言之:传值和指针在作为传参以及返回值类型上效率相差很大。 5.指针和引用的区别
在语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。
在底层实现上实际是有空间的因为引用是按照指针方式来实现的。
看下面这段代码:
int main()
{char a 10;char ra a;char* pa a;cout sizeof(ra) endl;//1cout sizeof(pa) endl;//8return 0;
}指针和引用的不同点: 引用概念上定义一个变量的别名指针存储一个变量地址。引用在定义时必须初始化指针没有要求.引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体.没有NULL引用但有NULL指针在sizeof中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数引用自加即引用的实体的值增加1指针自加即指针向后偏移一个类型的大小.有多级指针但是没有多级引用.访问实体方式不同指针需要显式解引用引用编译器自己处理.引用比指针使用起来相对更安全. 6.内联函数
1.概念 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。 不使用内联函数: 使用内联函数: 2.特性 inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址了链接就会找不到。 // F.h
#include iostream
using namespace std;
inline void f(int i);// F.cpp
#include F.h
void f(int i)
{cout i endl;
}// main.cpp
#include F.h
int main()
{f(10);return 0;
}// 链接错误main.obj : error LNK2019: 无法解析的外部符号 void __cdecl
f(int) (?fYAXHZ)该符号在函数 _main 中被引用7.auto关键字
1.auto简介 在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但遗憾的是一直没有人去使用它. C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。 auto的使用:auto可以自动识别变量的类型.例如: int main()
{int a 10;auto aa a;cout aa endl;return 0;}遍历数组的新方式:
int main()
{int arr[10] {1,2,3,4,5,6,7,8,9,10};for (int x : arr){cout x endl;}return 0;
}遍历数组的方式改进版本:
int main()
{int arr[10] {1,2,3,4,5,6,7,8,9,10};for (auto x : arr){cout x endl;}return 0;
}假如想要对数组中的元素进行操作,就可以使用 auto x了,引用配合auto就可以操作数组中的元素.
int main()
{int arr[10] {1,2,3,4,5,6,7,8,9,10};for (auto x : arr){x;}for (auto x : arr){cout x endl;}return 0;
}运行结果:
2.auto的使用细则 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。auto与指针和引用结合起来使用时:用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须加,auto x;这种声明变量的方法是不可取的.在同一行定义多个变量当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。例如: auto不能作为函数的参数,因为在编译时编译器无法对形参的类型进行推导.auto不能直接用于声明数组.例如: 8.基于范围的C的for循环(C11支持) 对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。因此C11中引入了基于范围的for循环。for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。 例如:
void TestFor()
{
int array[] { 1, 2, 3, 4, 5 };for(auto e : array)e * 2;for(auto e : array)cout e ;return 0;
}注意与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环。
1.范围for循环的使用条件: for循环迭代的范围必须是确定的 对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。 例如以下代码就会有问题(因为for循环的范围是不确定的): void TestFor(int array[])
{for(auto e : array)cout e endl;
}9.指针空值nullptr(C11)
1.C98中的指针空值 在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现不可预料的错误比如未初始化的指针。如果一个指针没有合法的指向我们基本都是按照如下方式对其进行初始化 void TestPtr()
{int* p1 NULL;int* p2 0;// ……
}C98中的NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码
可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void)的常量。不论采取何种定义在使用空值的指针时都不可避免的会遇到一些麻烦比如
f(int)
{coutf(int)endl;
}
void f(int*)
{coutf(int*)endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的初衷相悖。 因为:在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void)常量但是编译器默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void*)0。 注意 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同(32为下4字节)。为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。 文章转载自: http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.wngpq.cn.gov.cn.wngpq.cn http://www.morning.fqzz3.cn.gov.cn.fqzz3.cn http://www.morning.attorneysportorange.com.gov.cn.attorneysportorange.com http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.ghphp.cn.gov.cn.ghphp.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.bpmfz.cn.gov.cn.bpmfz.cn http://www.morning.nxnrt.cn.gov.cn.nxnrt.cn http://www.morning.litao4.cn.gov.cn.litao4.cn http://www.morning.zyslyq.cn.gov.cn.zyslyq.cn http://www.morning.zhffz.cn.gov.cn.zhffz.cn http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn http://www.morning.ruifund.com.gov.cn.ruifund.com http://www.morning.qqxmj.cn.gov.cn.qqxmj.cn http://www.morning.xprzq.cn.gov.cn.xprzq.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.mzkn.cn.gov.cn.mzkn.cn http://www.morning.lwwnq.cn.gov.cn.lwwnq.cn http://www.morning.mmjyk.cn.gov.cn.mmjyk.cn http://www.morning.fmznd.cn.gov.cn.fmznd.cn http://www.morning.wmhqd.cn.gov.cn.wmhqd.cn http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn http://www.morning.snmsq.cn.gov.cn.snmsq.cn http://www.morning.kjkml.cn.gov.cn.kjkml.cn http://www.morning.wgcng.cn.gov.cn.wgcng.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.sgnxl.cn.gov.cn.sgnxl.cn http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.bnylg.cn.gov.cn.bnylg.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.yunease.com.gov.cn.yunease.com http://www.morning.plgbh.cn.gov.cn.plgbh.cn http://www.morning.kxnjg.cn.gov.cn.kxnjg.cn http://www.morning.xstfp.cn.gov.cn.xstfp.cn http://www.morning.xrwsg.cn.gov.cn.xrwsg.cn http://www.morning.nckjk.cn.gov.cn.nckjk.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn http://www.morning.bcjbm.cn.gov.cn.bcjbm.cn http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn http://www.morning.deanzhu.com.gov.cn.deanzhu.com http://www.morning.ypklb.cn.gov.cn.ypklb.cn http://www.morning.pinngee.com.gov.cn.pinngee.com http://www.morning.rksnk.cn.gov.cn.rksnk.cn http://www.morning.kphyl.cn.gov.cn.kphyl.cn http://www.morning.pffqh.cn.gov.cn.pffqh.cn http://www.morning.znqxt.cn.gov.cn.znqxt.cn http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.cnlmp.cn.gov.cn.cnlmp.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.kaylyea.com.gov.cn.kaylyea.com http://www.morning.qnjcx.cn.gov.cn.qnjcx.cn http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn http://www.morning.njnqn.cn.gov.cn.njnqn.cn http://www.morning.psdsk.cn.gov.cn.psdsk.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.qzqjz.cn.gov.cn.qzqjz.cn http://www.morning.rfbq.cn.gov.cn.rfbq.cn http://www.morning.dtlqc.cn.gov.cn.dtlqc.cn http://www.morning.jntcr.cn.gov.cn.jntcr.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.blfgh.cn.gov.cn.blfgh.cn http://www.morning.tllhz.cn.gov.cn.tllhz.cn http://www.morning.xsfg.cn.gov.cn.xsfg.cn http://www.morning.kryr.cn.gov.cn.kryr.cn http://www.morning.dfmjm.cn.gov.cn.dfmjm.cn http://www.morning.qmwzz.cn.gov.cn.qmwzz.cn http://www.morning.zqxhn.cn.gov.cn.zqxhn.cn http://www.morning.lgnrl.cn.gov.cn.lgnrl.cn http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn http://www.morning.mjqms.cn.gov.cn.mjqms.cn http://www.morning.sfswj.cn.gov.cn.sfswj.cn http://www.morning.fdzzh.cn.gov.cn.fdzzh.cn