版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
03-指针和引用讲师:李明杰技术博客:新浪微博:constconst可以限定一个变量的值不允许被改变,使用const在一定程度上可以提高程序的安全性和可靠性const
inta=10;变量a的值是不能被修改的,永远都是初值10int
consta=10;跟上述写法是等价的voidsum(const
inta,const
intb)上面的函数可以防止别人篡改形参的值可以看出,const可以用来定义一个常量。作用跟enum、#define类似下面的例子表示p是个常量,不能再给p赋值,不能让p再指向其他变量inta=10;int*constp=&a;const下面的例子表示*p是个常量,不能通过*p来修改变量a的值inta=10;const
int*p=&a;下面的例子可以防止test函数的形参a指针修改外面age变量的值voidtest(const
int*a);intage=10;test(&age);下面的例子表示*p和p都是常量inta=10;const
int*
constp=&a;const习题下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?typedef
char*pStr;charstring[4]="bbc";const
char*p1=string;//1式const
pStrp2=string;//2式p1++;p2++;const习题判断下列p1、p2的变量类型
和
常量性int
const*p1,p2;int
const*constp1,p2;int*constp1,p2;const习题判断最后2句代码是否合理1)指针指向的变量的值不能变,指向可变intx=1;inty=2;const
int*px=&x;px=&y;*px=3;const习题2)指针指向的变量的值可以改变,指向不可变intx=1;inty=2;int*constpx=&x;px=&y;*px=3;const习题3)指针指向的变量的值不可变,指向不可变intx=1;inty=2;const
int*constpx=&x;px=&y;*px=3;const和#defineconst和#define都能用来定义常量,可以造成一改全部跟着一起改的效果实际上,更推荐使用const或者enum来定义常量const推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点const可以节省空间,避免不必要的内存分配。举例:#definePI13.14159
//常量宏const
double
PI2=3.14159;//此时并未将Pi放入RAM中double
a=PI2;//此时为Pi分配内存,以后不再分配!double
b=PI1;//编译期间进行宏替换,分配内存double
c=PI2;//没有内存分配double
d=PI1;//再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝#define的副作用#define有时候会产生一些不好的副作用,比如下面的例子://MAX宏返回两个数值中的最大值#defineMAX(x,y)((x)>(y)?(x):(y))inta=10;intb=6;intc=MAX(++a,b);cout<<"c="<<c<<",a="<<a<<endl;这时候的输出结果是:c=12,a=12如果将变量b的初值改为15,也就是intb=15;这时候的输出结果是:c=15,a=11#define的特殊用途#define还是有它无可取代的地方,比如传入一个参数,然后生成字符串#defineTO_STR(x)#xcout<<TO_STR(abcd)<<endl;连接多个参数,合成一个完整的标识符#defineCONCAT(x,y)x##yintmyage=20;cout<<CONCAT(my,age)<<endl;引用引用:其实就是给变量起一个别名引用的特点:引用没有独立的存储空间,跟被引用的变量共享存储空间对引用所做的改变,就是对所引用变量所做的改变引用的定义引用的定义格式:类型&引用名称=变量名;
比如下面的af就是变量a的一个引用inta=10;//引用必须在定义的时候就进行初始化int&af=a;//引用af和
变量a的内存地址一致cout<<&af<<","<<&a<<endl;//变量a的值被改为了20af=20;cout<<af<<","<<a<<endl;程序的输出结果是:0x7fff5fbff89c,0x7fff5fbff89c20,20引用的定义下面的例子表示bf、af同时引用着变量ainta=10;int&af=a;int&bf=af;cout<<&bf<<","<<&af<<","<<&a;打印出来的内存地址是一致的引用的使用注意引用必须在定义的时候就进行初始化。下面的是错误写法:int⁡引用一旦在定义的时候确定好引用哪个变量,以后都不能再引用其他变量inta=10;int&af=a;intb=20;af=b;最后一行代码af
=
b;并不代表af引用了变量b,而是将变量b的值赋值给了af引用,也就是将变量b的值给了aconst与引用下面的代码效果:不能通过af引用修改变量a的值。称af为const引用inta=10;const
int&af=a;下面的代码是不能编译通过的。因为ref引用的类型和变量d的类型不匹配doubled=1.78;int&ref=d;但是将ref改为const引用,就能编译通过doubled=1.78;const
int&ref=d;编译能通过的原因是const
int&ref=d;等价于下面2句:inttemp=d;const
int&ref=temp;也就是说ref引用跟变量d并不共享同一块存储空间引用
与
函数参数引用可以作为函数的形参,修改了引用形参,能影响外面实参变量的值如果要在函数内部修改外面实参的值,尽量使用引用作为形参,不要使用指针作为函数形参,原因如下:引用不占用额外的存储空间使用引用修改实参显得更自然、易懂引用
与
函数返回值引用也可以作为函数的返回值,主要目的是:可以将函数调用放在赋值运算符(=)的左边intages[]={20,15,36,17,28};int&ages_index(inti){
return
ages[i];}//相当于ages[0]=30;ages_index(0)=30;引用
与
函数返回值注意:不能返回对局部变量的引用int&add(inta,intb){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论