在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

const参数,const返回值与const函数相关推荐

  1. const 修饰函数参数,返回值,函数体,保护数据

    一.const 介绍 1.const 定义 const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 2.const 目的 const 推出的初始目的,正是为了取代预编译指令,消除 ...

  2. const 修饰函数参数,返回值,函数体

    看到const 关键字,C++程序员首先想到的可能是const 常量.这可不是良好的条件反射.如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮.const 更大的魅力是它可以修饰函数的 ...

  3. php 函数返回值mixed,认识函数的类型、参数与返回值

    函数的类型.参数与返回值 一.函数的基本语法语法 functionfunctionName(类型限定参数列表):返回值类型 { } 案例:计算两个数之和. functionsum(int$a,int$ ...

  4. C#多线程函数如何传参数和返回值

    提起多线程,不得不提起 委托(delegates)这个概念. 我理解的委托就是 具有 同样参数和返回值 的函数的集合. 比如 public delegate void MyDelegate(int a ...

  5. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  6. 13_python基础—函数进阶(参数、返回值、递归)

    文章目录 目标 一.函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 二.函数的返回值 进阶 2.1 示例 -- 温度和湿 ...

  7. python中result函数用法_python中函数的参数和返回值

    函数 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形式 ...

  8. python函数返回值和参数_python_函数参数和返回值

    01.函数参数和返回值的作用 函数:封装功能独立的代码,在需要时通过函数名调用,可以直接访问全局变量 参数:外界希望在函数内部处理数据 返回值:向外界报告函数的执行结果 定义函数时, 是否接受参数,或 ...

  9. 【C# 调用 Go 语言】0x2 参数、返回值与类型转换

    在上篇文章[C# 调用 Go 语言]0x1 Hello Golang  中,我们将 Golang 源码编译为动态链接库(dll),用 C# 调用 Golang 导出的方法并成功的看到了控制台的输出.本 ...

最新文章

  1. 创建Silverlight自定义启动画面
  2. 向PE文件中空白处添加代码
  3. python 时间模块备忘
  4. [linux] shell脚本编程-统计日志文件中的设备号发通知邮件
  5. Javascript 构造函数模式、原型模式
  6. 我从机器人先生那里了解到了有关InfoSec的全部信息
  7. 中国电信:1月5G套餐用户数净增826万户
  8. C语言动态库libxxx.so的几种使用方法
  9. 今天我们聊聊,小程序开发的入手门槛还是比较低的
  10. java集合学习笔记--二维集合HashMap
  11. 【数值分析实验】线性代数方程组的直接解法:列主元高斯消去法、LU分解法、LU分解法求矩阵的逆(python)
  12. 无人驾驶虚拟仿真(十五)--障碍物检测与识别1
  13. 英特尔神经计算棒是什么?边缘计算又是什么?
  14. 【中文分词】基于ICTCLAS的Python中文分词
  15. 科普贴,告诉大家SGLTE、SVLTE、CSFB、SRLTE的意思
  16. 打印机在不同操作系统的打印区别
  17. 如何用arcgis分析点到点的距离
  18. 上海交通大学计算机系非全日制,关于上海交通大学非全日制研究生中最便宜的专业...
  19. 【nowcoder】笔试强训Day9
  20. Python 队列之传土豆(《Python数据结构与算法分析》第二版)

热门文章

  1. 关于明晚即将发布的新款 iPad Pro,最大的亮点也许不是 Face ID
  2. ubuntu 常用软件和命令
  3. Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)
  4. MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程
  5. 幽幽的灵光射不出你想要的疯狂
  6. 在Linux中创建静态库.a和动态库.so
  7. 【自己给自己题目做】:如何在Canvas上实现魔方效果
  8. 再谈SQL Server中日志的的作用
  9. Web Service实现分布式服务的基本原理
  10. 在Asp.net网页中使用接口