C++中const关键字的使用总结

 const是不变的意思,在C++程序中,经常用const来限制对一个对象的操作:

 

1.1 const变量

例如: const int n=3;   则这个变量的值不能改变,即不能对变量赋值。

 

1.2  const参数

出现在函数参数中的const表示在函数体中不能对这个参数做修改。比如strcmp()函数用来比较两个字符串的大小,在函数体中不应该改变两个的参数的值,所以将它定义为是const的。const通常用来限制函数的指针参数、引用和数组参数,而一般形式的参数因为形式参数和实参本来就不在同一个内存空间,所以对形式参数的修改不影响实在参数,因此也没有必要限制函数不能对参数进行修改。

下面是一些使用函数const参数的例子:

(1)函数strcpy()src字符串的内容复制到targ字符串中,为保证src字符串不被修改,将它定义问const参数:

void strcpy(const char* src,char * targ);

 (2)函数max() 从数组array中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会再函数中被修改,将它定义为const参数:

int max(const int array[] ,int size);

     (3)函数outputOjbect()将类MyClass的对象obj的内容输出。对象定义为const引用,即可以保证对象不会在函数体中所改变,又可以节省对象传递的开销,如:

void outputObject(const MyClass & obj);

 

1.3 const 返回值

函数返回值为const只有用在函数返回为引用的情况。函数返回值引用常量表示不能将函数调用表达式作为左值使用。

例如:

int &min(int &i,int &j); 可以对函数调用进行赋值,因为它返回的是左值: min(a,b)=4;

但是,如果对函数的返回值限定为const的:

const int &min(int &i , int &j); 那么,就不能对min(a,b)调用进行赋值了。

 

1.4 const 函数

在学到类时,将会看到可以为类的成员函数进行如下形式的定义:

calss classname{

public :

int getMember() const;

private :

int member;

};

这里,在函数定义头后面加上的const表示这个函数是一个“只读函数”,函数不能改变类对象的状态,不能改变对象的成员变量的值。如在函数体中不能这么写:

classname::getMember()

{

member=4; //错误!不能修改成员变量的值

return member;

}

 

1.5 用const 来限制指针

1).指向常量的指针:

const出现在指针定义的最开始时,表示定义了一个指向常量的指针。比如:

  int i;    const int ci=20;

 const int * ip1=&ci;    const int * ip2=&i;

  这里定义了两个指向常量的指针,ip1ip2。并且ip1初始化为指向一个常量ciip2初始化为指向一个变量i

        指向常量的指针的含义是:不能用过指针来间接修改指针所指向内存空间的值。比如上面的例子就不能通过*ip1来修改常量ci的值,也不能通过*ip2来修改变i的值,所以下面的语句不正确:

        *ip1=34 //错误! ip1是指向常量的指针

        *ip2=54;        //错误! ip12是指向常量的指针

在使用指向常量的指针时,应该注意以下几点:

a).指向常量的指针只限制指针的间接访问操作,而不会限制指针变量本身的操作。所以,可以改变指针本身的值。比如可以修改ip1ip2的值:ip1=&i;  ip2=&ci;

b).指向常量的指针只限制指针的间接访问的操作,但不会限制所指向的空间的操作。比如指针ip指向一个变量i:

         int i;   const int *  ip=&i;

         *ip=34;    //错误! ip是指向常量的指针

       i=56;      //正确,i是一个变量

    c).如果要给一个指针赋一个常量的地址,则这个地址必须定义成指向常量的指针。这样可以保证不会通过指针来间接修改常量的值。比如:

           const int ci=30; //正确!

           const int* ip1=&ci; //错误! 必须将ip2定义成指向常量的指针

       ci是一个常量,如果要将它的地址赋值给一个指针,这个指针必须是一个指向常量的指针。所以不能将一个不指向常量的指针ip2指向常量ci.

 

2). 指针常量

在定义指针的时候,可以通过在指针名的前面加上const来将指针定义成常量,称为指针常量。和一般的常量一样,我们不能修改指针常量的值。即我们只能在定义指针时将它初始化为指向某个地方,不能再对指针赋值。下面是对指针常量的定义:

int i,j;

int * const ip=&i; //正确!定义指针常量ip,初始化为指向变量i

ip=&j; //错误!不能改变指向常量的值

注意,对指针变量的const限制并不影响对它所指向空间的操作。可以通过间接引用来操作符‘*’来修改指针所指向的空间值。例如上面定义的指针常量ip指向变i,可以通过*ip来改变的值: *ip=32 //正确!

3). 指向常量的指针常量

如果将上面两个结合起啦,就可以定义指向常量的指针常量。下面定义了这么一个指针:

const int ci=93;

const int * const pi=&ci;

指向常量的指针常量必须在定义时初始化,它的使用也非常受限制,我们不能改变指针本身的值,也不能通过指针来间接改变指针,只能在程序中使用它们的值。

 

上面介绍了利用const来限定指针的三种情况。需要记住的是,指针本身和指针所指向的空间是两个不同的内存空间,所以需要对两者分别限定。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php封装redis负载均衡类

$array array( master > array( "redis://127.0.0.1:6379?timeout1", ), slave > array( "redis://127.0.0.1:6479?timeout1", "redis://127.0.0.1:6579?timeout1", ) ); $redis R…

我今天对JavaFX的了解

如果您没有听说过,JavaFX 2是Java的新Desktop / web / client框架。 自JavaFX 1以来,它已经进行了相当大的改动(坦率地说,效果并不那么令人印象深刻)。 自定义脚本语言已经淘汰了,您可以使用标准Java和基于…

怎么解决xp系统不能安装NET Framework4.0?

.net 4.0安装不上解决方法: 引用 9 楼 MoreQuestion 的回复: 全部都不行!就是用360软件管家安装那个就可以了。用了楼主的方法,果然可行啊 1.先安装wic。 2.用360安装.net40 本帖最后由 不懂 于 2014-6-6 00:56 编辑Windows Server 2003 如何…

C++内联(inline)函数

内联函数 内联函数是一种特殊类型的函数,内联函数在定义或声明时前面加上“inline”关键字。比如: inline int max(int a,int b) { return (a>b)?a:b; } 内联(inline)是内联扩展(inline expansion)的简…

我的python学习笔记全集_记录我的Python学习笔记

不想再像以前那样,什么都从头开始学习语法、总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身。所以还是先熟练使用语言去进行开发,等足够熟悉了,…

HDU 5794:A Simple Chess(Lucas + DP)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid5794 题意:让一个棋子从(1,1)走到(n,m),要求像马一样走日字型并只能往右下角走。里面还有r个障碍点不能经过或者到达&am…

php源码分析之PHPAPI宏的作用

在PHP源码中,我们经常会看到很多函数前面有个PHPAPI,但这是什么呢? 于是我在php源码/main/php.h中找到了它的定义 #ifdef PHP_WIN32 # include "tsrm_win32.h" # include "win95nt.h" # ifdef PHP_EXPORTS # …

15分钟内开始使用Amazon Web Services和全自动资源调配

在等待一个新项目时,我想学习一些有用的东西。 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能,而很少有足够的硬件来生成实际负载,因此我决定学习更多有关按需在云中按需配置虚拟机的知识,即Amazon Web Servic…

解析JVM内存区域组成

在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的JVM内存空间;而在堆中分配的JVM内存由java虚拟机的自动垃圾回收器来管理。…

python打开浏览器后带cookie_Python爬虫使用浏览器的cookies:browsercookie

很多用Python的人可能都写过网络爬虫,自动化获取网络数据确实是一件令人愉悦的事情,而Python很好的帮助我们达到这种愉悦。然而,爬虫经常要碰到各种登录、验证的阻挠,让人灰心丧气(网站:天天碰到各种各样的爬虫抓我们网…

VS插件开发

参考资料: VS插件开发 - 个性化VS IDE编辑器 自己动手编写一个VS插件(一) VS Addin插件基本开发入门 VS Addin插件配置、部署 转载于:https://www.cnblogs.com/wangwangfei/p/5830081.html

使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍

静态地或在运行时将代码片段注入已编译的类和方法中的功能可能会很有帮助。 这尤其适用于在没有源代码的第三方库中或在无法使用调试器或探查器的环境中对问题进行故障排除。 代码注入对于处理涉及整个应用程序的问题(例如性能监视)也很有用。 以这种方式…

Java中的变量

java类的成员变量有两种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量。 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的…

无限漫游

一、FAT AP架构下,AP设备不做认证时: (1) AP1,AP2正常工作,发送Beacon帧,向STA通告支持的无线服务; (2) STA搜索到AP1的信号,向AP1发Probe Request,请求获取AP1所提供的无线服务;AP…

uni-app内置地图轨迹_MIUI11 新增亲情守护,支持安全围栏、运动轨迹功能

点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事!日前,小米 MIUI 体验总负责人 MIUI小凡 在微博上为大家预告了 MIUI11 的新特性「亲情守护」,并表示「在亲情守护中,我们…

:before与:after伪类的应用

1.小三角样式 .tip{ position:relative; display:inline-block; width:100px; margin:100px; padding:30px 20px; color:#fff; border:1px solid #666; border-radius:5px; background-color:rgba(0,153,51,1);}.tip:before{ content:; posit…

小心重载API方法

重载方法是API设计中的重要概念,尤其是当您的API是流利的API或DSL( 特定于域的语言 )时。 对于jOOQ就是这种情况,在这种情况下,您经常想使用与完全相同的方法名称来与库进行各种交互。 示例:jOOQ条件 pac…

phpcms 下载模型列表页直接点击下载

下载模型设置本地下载 列表页模板直接调用 <article class"prjDown"><p class"prjDownTitle">方案下载</p><nav class"prjDownNav"><ul>{pc:content action"lists" catid"$catid" num"3…

为什么Java中类方法不能访问实例方法

我们已经知道类体中的方法分为实例方法和类方法两种&#xff0c;用static修饰的是类方法。二者有什么区别呢&#xff1f;当一个类创建了一个对象后&#xff0c;这个对象就可以调用该类的方法。 当类的字节码文件被加载到内存时&#xff0c;类的实例方法不会被分配入口地址&…

python展开 c函数中的宏预处理_C中的预处理宏

C中的预处理宏宏定义就属于预处理命令的一种。那么&#xff0c;什么是宏呢&#xff1f;宏&#xff1a;c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。宏替换&#xff1a;宏替换就是宏定义。在编译预处理中&#xff0c;将程序中所有的宏名用相应的字符串…