const参数,const返回值与const函数

在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的:

const  int  n=3;

则这个变量的值不能被修改,即不能对变量赋值。

       const 这个关键字经常出现在函数的定义中,而且会出现在不同的位置,比如:

               int  strcmp (const  char  *str1,const   char  *str2);

              const   int  & min (int  &, int  &);

              void  printMessage (char  *msg) const;

1.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)  函数 outputObject( ) 将类 Myclass 的对象 obj 的内容输出。对象定义为 const  引用,即可以保证对象不会在函数体中有所改变,又可以节省对象传递的开销:

              void  outputObject ( const   Myclass  &obj) ;

PS:

       const 指针可以接受const 和非 const 地址,但是非const 指针只能接受非const 地址。所以const  指针的能力更强一些,所以尽量多用const 指针,这是一种习惯。

2. const 返回值

        函数返回值为 const  只有用在函数返回为引用的情况。 函数返回值引用常量表示不能将函数调用表达式作为左值使用。例如前面讲的返回引用的函数 min( )。

        int  & min ( int  &i,  int  &j); 

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

但是,如果对函数的返回值限定为 const  的:const  int  & min ( int & i, int  &j );

那么,就不能对 min ( a, b ) 调用进行赋值了。

3. const 函数

         在类中,可以为类的成员函数进行如下形式的定义:

class  classname {

          int  member ;

  public:

         int  getMember ( ) const;

};

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

    classname :: getmember( )

   {  member =4 ; 

     return  member;

   }

 

另外,const成员函数也不能在函数中调用其他非const 的函数。______________________________________________________________________________

补充:

以下内容转载于: http://www.chinaunix.net/jh/23/300602.html

以下面的例子为例进行说明:

#include <iostream>;

#include <string>;

using namespace std;

class Student {

        string name;

        int score;

public:

    Student ( ) { } 

    Student ( const string& nm, int sc = 0 )  : name( nm ), score( sc ) { }

   

    void set_student( const string& nm, int sc = 0 )   // 后面不能有const

        {     name = nm;         score = sc;        }

    const string& get_name() const

       {     return name;   }

   int get_score() const

       {     return score;   }

};

// output student's name and score

void output_student( const Student& student )

{

  cout << student.get_name() << "/t";

  cout << student.get_score() << endl;

}

int main()

{

  Student stu( "Wang", 85 );

  output_student( stu );

}

  

首先说一点题外话,为什么 get_name( ) 前面也加 const。如果没有前后两个 const 的话,get_name() 返回的是对私有数据成员 name 的引用,所以通过这个引用可以改变私有成员 name 的值,如:

  Student stu( "Wang", 85 );

  stu.get_name() = "Li";      //  引用可以作为左值

即把 name 由原来的 "Wang" 变成了 "Li",而这不是我们希望的发生的。所以在 get_name() 前面加 const 避免这种情况的发生。

 

那么,get_name( ) 和 get_score( ) 这两个后面应该加 const 的成员函数,如果没有 const 修饰的话可不可以呢?回答是可以!但是这样做的代价是:const 对象将不能再调用这两个非const成员函数了。如:

const string& get_name( );

int get_score( );        // 这两个函数都应该设成 const 型

void output_student( const Student& student )

  {

  cout << student.get_name() << "/t";

  cout << student.get_score() << endl;

// 如果 get_name() 和 get_score() 是非const 成员函数,这两句调用都是错误的

}

 

由于参数 student 表示的是一个对const Student 型对象的引用,所以 student 不能调用非const 成员函数如 set_student(  )。如果 get_name() 和 get_score() 成员函数也变成非const 型,那么上面的 student.get_name() 和 student.get_score() 的使用就是非法的,这样就会给我们处理问题造成困 难。

因此,我们没有理由反对使用const,该加const 时就应该加上const,这样使成员函数除了非const 的对象之外,const 对象也能够调用它。

 

对象.成员函数
         对象          成员函数       对/错

1、  const            const              对

2、 const           non-const         错

3、  non-const     const              对

4、  not-const     non-const        对

          成员函数调用成员函数
     成员函数      成员函数       对/错

5、  const            const             对

6、  const         non-const         错

7、  non-const     const             对

8、  non-const     non-const      对

转载于:https://www.cnblogs.com/guanqingbuyu/p/5562866.html

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

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

相关文章

python简笔画怎么画_怎样用tk语句在Python下画一棵树

展开全部 1.代码的结2113构&#xff1a; 本代码有两个子5261函数组成&#xff0c;据图有main函数4102和画树函数组成。 2.编写画1653树函数&#xff1a; 画树函数&#xff0c;就是用来画出我们的树的一种子函数&#xff0c;代码如下&#xff1a;def tree(plist,l,a,f): if l>…

论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss

文章目录1 概述2 模型架构3 模块解析3.1 获取梅尔频谱3.2 speaker encoder3.3 AutoVC3.4 Vocoder4 关键部分参考资料1 概述 voice conversion这个任务的目标是输入两个音频&#xff0c;其输入是两段音频&#xff0c;一段音频称为content_audio&#xff0c;另一段称为speaker_a…

二十五、PHP框架Laravel学习笔记——模型的一对一关联

一&#xff0e;关联概念 关联模型&#xff0c;即&#xff1a;两张或以上的表进行一定规则的绑定关联&#xff1b;比如&#xff1a;一个学生(学生表)对应一张个人信息卡(信息表)&#xff0c;这种就是一对一&#xff1b;再比如&#xff1a;一篇博文(帖子表)对应多个评论(评论表)…

linux-0.11内核 调试教程+GCC源代码

http://pan.baidu.com/share/home?uk453348606&viewshare#category/type0 http://blog.csdn.net/oldlinux/article/details/42558445转载于:https://www.cnblogs.com/zengkefu/p/5563351.html

python 私有属性_Python3伪私有属性

1&#xff1a;伪私有属性介绍 在Python中一切都是对象&#xff0c;并且类的所有属性和方法都是公有的(public)&#xff0c;并不存在private 关键字来声明私有方法或属性。那么在Python中怎么实现像其他编程语言一样的私有属性呢&#xff1f;其实只需在属性前加上双下划线(但是结…

小工具:基于颜色的视频和图片切割

文章目录1 前言2 方案简述3 效果1 前言 最近做一个短视频相关的项目的时候&#xff0c;发现输入的视频有很多是有黑边的&#xff0c;有些可能是白边或者其他颜色的边。这对下游的模型处理有很大的影响。于是就写了一个自动判断填充边的颜色&#xff0c;并根据该颜色自动切割视…

二十六、PHP框架Laravel学习笔记——模型的一对多关联

二&#xff0e;一对多关联 一对多关联&#xff0c;本质上使用方法和一对一关联类似&#xff0c;内部实现略有不同&#xff1b; 创建另一个模型&#xff1a;book.php&#xff0c;我们看下这个表数据&#xff1b; PS&#xff1a;这里 user_id19 有三个&#xff0c;也就是蜡笔小…

论文阅读 - An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

文章目录1 概述2 方法简述2.1 encoder之前2.2 encoder之后3 实验结果参考资料1 概述 这篇论文是一篇将tranformer引入到图像领域的里程碑式的文章。因为这是第一次在处理图像时&#xff0c;将所有的卷积模块统统抛弃&#xff0c;只使用attention。并且实验证明了只用attention…

数据仓库参考

虽然大多数看起来稀里糊涂&#xff0c;不过先留档&#xff0c;实践过程中再回头整理总结。 * 系统设计与架构笔记:ETL工具开发和设计的建议 * 数据仓库原理<2>&#xff1a;数据仓库系统的体系结构 * 数据仓库开发之路之一--准备工作转载于:https://www.cnblogs.com/oDora…

python五子棋人机对战_Python:游戏:五子棋之人机对战

原标题&#xff1a;Python&#xff1a;游戏&#xff1a;五子棋之人机对战 开端 画棋盘 首先肯定是要画出棋盘来&#xff0c;用 pygame 画出一个 19 19 或 15 15 的棋盘并不是什么难事&#xff0c;这在之前的文章中已经多次用到&#xff0c;就不赘述了。 画棋子 需要说一下的是…

二十七、PHP框架Laravel学习笔记——模型的多对多关联

二&#xff0e;多对多关联 多对多关联&#xff0c;比前面两种要复杂一些&#xff0c;需要一张中间表&#xff0c;共三张&#xff1b; (1) .users&#xff1a;用户表&#xff1b; (2) .roles&#xff1a;权限表&#xff1b; (3) .role_user&#xff1a;中间表&#xff1a;默…

论文阅读 - Is Space-Time Attention All You Need for Video Understanding?

文章目录1 概述2 模型结构2.1 模型输入2.2 attention模块2.3 分类模块3 模型分析3.1 不同attention方式3.2 不同的输入3.3 不同的模型3.4 不同的预训练数据3.5 不同的数据量3.6 position embedding的影响3.7 长输入时长3.8 不同的transformer3.9 不同的patch size3.10 attentio…

iOS中常见的6种传值方式,UIPageViewController

通过属性传值、方法传值、代理传值、Block传值、单例传值、通知传值6种方式进行不同视图之间的传值。不同方式只需要在AppDelegate中更改下UINavigationController的根控制器即可。使用很简单的实例让你很快理解不同的传值方式。 UIPageViewController(上传者&#xff1a;JoneJ…

websocket 获取ip_Spark+Kafka+WebSocket+eCharts实时分析-完全记录(1)

本系列内容&#xff1a;Kafka环境搭建与测试Python生产者/消费者测试Spark接收Kafka消息处理&#xff0c;然后回传到KafkaFlask引入消费者WebSocket实时显示版本&#xff1a;spark-2.4.3-bin-hadoop2.7.tgzkafka_2.11-2.1.0.tgz------------------------第1小节&#xff1a;Kaf…

二十八、PHP框架Laravel学习笔记——模型的关联查询

二&#xff0e;关联查询 前几篇博文&#xff0c;了解了三种基础的关联模型&#xff0c;并简单的进行查询&#xff1b;本节课&#xff0c;我们详细的了解更多的查询方案&#xff1b; //下面两种查询是一样的&#xff1b; $books User::find(19)->book; $books User::fin…

读书笔记第五章

开发板是开发和学习嵌入式技术的主要硬件设备&#xff0c;尽管可以在PC上开发Linux驱动&#xff0c;然后重新编译成ARM架构的Linux驱动模块。但最终都是要在开发板上测试的。主要是因为ARM架构的开发板基于X86架构的PC在CPU指令以及二进制格式上都有所不同。 …

搞懂CRF

文章目录1 前言2 Log-linear model3 MEMM3.1 模型概述3.2 label bias问题4 CRF4.1 模型概述4.2 模型训练4.3 模型解码4.4 小结参考资料1 前言 条件随机场(conditional random field, CRF)是在建立序列模型时的常用模块&#xff0c;它的本质就是描述观测到的序列xˉ\bar{x}xˉ对…

skywalking 安装_SkyWalking全链路追踪利器

随着目前系统架构的复杂度越来越高(中台、微服务)&#xff0c;并且线上应用的多级监控覆盖到了通讯、应用处理过程监控并且实现端到端的应用监测&#xff0c;线上性能故障的快速定位修复&#xff1b;而传统的监控分析方式已经无法满足我们的需求&#xff0c;因此许多强大的APM工…

二十九、PHP框架Laravel学习笔记——Debugbar 调试器

二&#xff0e;安装使用 通过 composer 在项目中安装 Debugbar&#xff0c;命令如下&#xff1a; composer require barryvdh/laravel-debugbar 生成一个配置文件&#xff0c;给用户配置&#xff0c;可以根据需求进行配置&#xff1b; php artisan vendor:publish --provider…

am335x reboot 命令分析

本文记录am335x运行reboot命令时&#xff0c;内核中运行过程。 Tony Liu, 2016-6-8, Shenzhen 参考链接&#xff1a;http://blog.csdn.net/wavemcu/article/details/8544333 kernel/sys.c void kernel_restart(char *cmd) {kernel_restart_prepare(cmd); …