(转)const参数,const返回值与const函数

原文地址:http://04051051.blog.163.com/blog/static/8600749320103100716140/

 

       在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     对

C++ const函数返回值应为const引用 在C++中,函数可以被声明为const成员函数,这意味着这些函数不会修改对象的状态。当我们在const成员函数中返回一个值时,为了保证对象的状态不被修改,返回值的类型通常是const引用。如果我们在const函数中返回一个非const的引用,那么调用者可以通过该引用修改对象的状态,这违反了const函数的约束。由于返回的是一个引用,而不是实际的对象副本,这种方式还能够避免不必要的拷贝操作,提高性能。这个示例展示了如何使用const引用返回const函数的结果,确保对象状态的不可变性,并防止对返回值的修改。 阅读详情

相关推荐

Cesium体渲染实战:从医学CT到气象数据的3D可视化全攻略

本文详细介绍了如何利用Cesium体渲染技术实现医学CT和气象数据的3D可视化。从数据预处理到交互式渲染,涵盖了DICOM和NetCDF格式的处理技巧,以及性能优化的实战策略,帮助开发者高效处理复杂的三维数据集。

weixin_28717431的博客 420

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

http://04051051.blog.163.com/blog/static/8600749320103100716140/  在C++程序中,经常用const 来限制对一个对象的操作,例如,将一个变量定义为const 的:  const  int

806

西安交通大学SQ轴承数据集(文末附数据)

西安交通大学SQ轴承数据集

qq_43271683的博客 1万+

[C/C++] const 详解(修饰变量、输入参数、返回值、成员函数)

转自 http://blog.xieyc.com/const-in-detail/ 看到const关键字,程序员首先想到的可能是const 常量。 const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。 const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多

2555

华为MetaERP国资委语境下的 DRP(全域数字化资源管理平台/Digitalized Resource-management Platform)与传统 ERP(以 SAP、Oracle 为代表)的

【摘要】国资委推动的DRP(全域数字化资源管理平台)正在重构央国企数智化转型路径,其本质是通过"ERP管交易+DRP管管控"的双层架构实现升维替代。与传统ERP相比,DRP具有三大突破:采用国产分布式数据库实现全级次穿透监管、构建数据中台打破信息孤岛、以实时分析替代事后报表。当前政策明确2026-2030年分阶段建设目标,这将重塑产业格局——倒逼传统ERP厂商转型,为云原生/AI/信创企业创造新机遇。需注意DRP并非简单替代ERP,而是通过治理模式变革实现"交易系统做薄、管控中

金牌架构师 286

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 219

深入解析 const 关键字:指针、参数、返回值和类成员函数

在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。使用const有以下好处:编译器的静态检查:const 可以让编译器在编译时进行静态检查,确保不会对被声明为 const 的值进行修改。如果尝试修改 const 值,编译器将产生错误或警告。代码可读性和维护性:使用 const 可以清晰地表达代码的语义,指出某个值不会被修改。可以提高代码的可读性,并且在维护代码时能够更好地理解和推理代码的含义。防止意外修改:通过使用 const,可以避免在代码中意外地修改某个值。特别是当多人协作开

卜及中的博客 4617

一根网线,让整个公司断网,二层环路真实事故复盘

那天晚上 23:47,监控告警突然爆了。核心交换机 CPU 100%。ARP 表暴涨。广播流量飙升。业务系统集体超时。5 分钟后,全公司断网。运维群里一句话:“是不是黑客攻击?但老网工都知道,这种现象只有一种可能:二层环路。

网络技术联盟站 346

const修饰函数、返回值、参数(2.24)

因为上面说了形参在接收的时候是会创建一个临时变量的,那么对于传递的自定义类,他会new一个对象出来,这个对象调用构造函数构造,而在函数结束时还要调用析构函数析构,这样带来的开销就非常大了。以上,对于类的成员变量的修改,即使不是修改值,而是将成员变量从一个int型变为一个地址,这样也是一种对于成员变量的改变。而在const修饰的函数中,对于成员变量是给予了const属性的。而const成员函数只能调用const成员函数,对于非const函数,即使在函数内部没有修改成员变量,也不能被const函数所调用。

qq_44452887的博客 5594

QT使用libssh2库通过密匙实现sftp协议上传文件

qt下使用libssh2通过密匙连接sftp服务器端

小米的修行之路 940

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1767

const 修饰函数的参数和作为返回值

看到const关键字,程序员首先想到的可能是const 常量。 const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。 const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。   一、const ...

hjssss的博客 1万+

RK3588平台开发系列讲解(USB篇)UAC初识

📢本篇将介绍RK3588平台`UAC`的配置使用。

内核笔记 3878

C++ const修饰函数、函数参数、函数返回值

转载自:https://blog.youkuaiyun.com/my_mao/article/details/22872149const修饰函数在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。[cp...

陌上人如玉,公子世无双。 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

const的用法,Const函数,Const变量,函数后面的Const

在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针。可以改变this所指向的值,但不能改变 this所保存的地址。 在 const成员函数中,this的类型是一个指向 const类类型对象的 const指针。既不能改变 this所指向的对象,也不能改变 this所保存的地址。 关键字:Const,Const函数,Const变量,函数后面的Const 看到 const关键字,C++程序员首先想到的可能是 const常量。这可不是良好的条件反射。如果只知道用 const定义

周杰伦 4604

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ const修饰函数、函数参数、函数返回值的用法

前言 可能有些人会对下面的const的含义,有点迷糊 //11 区间排序,按右端点从大到小排序 struct Range { int l, r; bool operator< (const Range &W) const { return r < W.r; } }; 本文会带你好好理解下const在不同地方的具体含义...

捡起一束光的博客 2614

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

const修饰函数参数,返回值,成员函数

一提到到const 关键字,我们首先想到的可能是const常量。但const的功能可不仅仅局限于此,它可以修饰函数参数,返回值,甚至函数的定义体。const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。下面我们讲一下以下三种情况:1.const修饰函数的参数2.const修饰函数的返回值3.const修饰成员函数1.co...

Koma_CC的博客 2785

C++函数前后加const的区别

1、函数前后const 函数前const:普通函数或成员函数(非静态成员函数)前均可加const修饰,表示函数的返回值为const,不可修改。格式为: const returnType functionName(param list) 函数后加const:只有类的非静态成员函数后可以加const修饰,表示该类的this指针为const类型,不能改变类的成员变量的值,即成员变量为read only...

Gorgeous_mj的博客 2万+

【详解】const(参数、返回值、成员函数)

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。 const Date* const this; 第一个const表示指向空间的内容不能修改,第二个const表示指针本身的内容不能修改。 1.修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用下文讨论的“指针传递”还是“引用传递”,都不能加const 修饰,否...

Mmmmmmmrr的博客 2392
上一篇: (转)浅谈IBM DB2的数据库备份与恢复
下一篇: (转)final 关键字 和 static 用法
mlxia
博客等级 码龄26年 28粉丝 410原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值