const使用详解 作者:康建东 关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,现将本人的一些体会总结如下,期望对大家有所帮助: 一 const基础 如果const关键字不涉及到指针,我们很好理解,下面是涉及到指针的情况: int b = 500; const int* a = &b; [1] int const *a = &b; [2] int* const a = &b; [3] const int* const a = &b; [4] 如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。 另外const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法: A& operator=(const A& a); void fun0(const A* a ); void fun1( ) const; // fun1( ) 为类成员函数 const A fun2( ); 二 const的初始化 先看一下const变量初始化的情况 1) 非指针const常量初始化的情况: A b; const A a = b; 2) 指针(引用)const常量初始化的情况: A* d = new A(); const A* c = d; 或者:const A* c = new A(); 引用: A f; const A& e = f; // 这样作e只能访问声明为const的函数,而不能访问一般的成员函数; [思考1]: 以下的这种赋值方法正确吗? const A* c=new A(); A* e = c; [思考2]: 以下的这种赋值方法正确吗? A* const c = new A(); A* b = c; 三 作为参数和返回值的const修饰符 其实,不论是参数还是返回值,道理都是一样的,参数传入时候和函数返回的时候,初始化const变量 1 修饰参数的const,如 void fun0(const A* a ); void fun1(const A& a); 调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。 [注意]:参数const通常用于参数为指针或引用的情况; 2 修饰返回值的const,如const A fun2( ); const A* fun3( ); 这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。 const Rational operator*(const Rational& lhs, const Rational& rhs) { return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); } 返回值用const修饰可以防止允许这样的操作发生: Rational a,b; Radional c; (a*b) = c; 一般用const修饰返回值为对象本身(非引用和指针)的情况多用于二目操作符重载函数并产生新对象的时候。 [总结] 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。 原因如下: 如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。 [思考3]: 这样定义赋值操作符重载函数可以吗? const A& operator=(const A& a); 四 类成员函数中const的使用 一般放在函数体后,形如:void fun() const; 如果一个成员函数的不会修改数据成员,那么最好将其声明为const,因为const成员函数中不允许对数据成员进行修改,如果修改,编译器将报错,这大大提高了程序的健壮性。 五 使用const的一些建议 1 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委; 2 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题; 3 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上; 4 const在成员函数中的三种用法(参数、返回值、函数)要很好的使用; 5 不要轻易的将函数的返回值类型定为const; 6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用; 本人水平有限,欢迎批评指正,可以联系 kangjd@epri.ac.cn [思考题答案] 1 这种方法不正确,因为声明指针的目的是为了对其指向的内容进行改变,而声明的指针e指向的是一个常量,所以不正确; 2 这种方法正确,因为声明指针所指向的内容可变; 3 这种做法不正确; 在const A::operator=(const A& a)中,参数列表中的const的用法正确,而当这样连续赋值的时侯,问题就出现了: A a,b,c: (a=b)=c; 因为a.operator=(b)的返回值是对a的const引用,不能再将c赋值给const常量。 srcurl: http://www.vckbase.com/document/viewdoc/?id=412

转载于:https://www.cnblogs.com/cnarg/archive/2011/05/16/const.html

[转]const使用详解相关推荐

  1. php const用法详解

    php const用法详解 在编程中,我们一般用常量来定义那些在运行时不能被改变的常数值,下面让我们来看看php中的const吧,这个东西其 实没有什么好说的,只是为了知识的完善而随便说下吧.在定义一 ...

  2. C语言高频率--typedef和const用法详解

    一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...

  3. C语言中const用法详解

    C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...

  4. const 关键字详解

    const 关键字详解 一.const关键字简介 二.const的用法 1.修饰局部变量.全局变量以及字符串常量 2.修饰指针 3.修饰函数的参数 4.修饰函数的返回值 5.const成员函数(C++ ...

  5. C语言const关键字详解

    C语言的const关键字 const 在实际编程中用得并不多,const 是 constant 的缩写,意思是"恒定不变的"!它是定义只读变量的关键字,或者说 const 是定义常 ...

  6. C++ static与const用法详解

    目录 static的作用: 对普通变量: 1.局部变量: 2.全局变量 对类中变量: 1.成员变量 2.成员函数 const的作用: static的作用: 对普通变量: 1.局部变量: 在局部变量之前 ...

  7. c++笔试必考内容:const使用详解

    关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,现将本人的一些体会总结如下,期望对大家有所帮助: 一 const基础 如果const关键字不涉及到指针,我们很好理 ...

  8. java中finaljava中this_Java中this,static,final,const用法详解

    一.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?JAVA提供了一个很好的东西, ...

  9. php const 怎么用,php const用法详解

    在编程中,我们一般用常量来定义那些在运行时不能被改变的常数值,下面让我们来看看php中的const吧,这个东西其 实没有什么好说的,只是为了知识的完善而随便说下吧.在定义一个常量的时候我们可以使用co ...

最新文章

  1. ggplot2笔记6:标度、轴和图例
  2. TCP/IP反码求和校验
  3. MySQL—04—MySQL的其他对象
  4. 被同事嘲笑说技术方案没深度?
  5. 爱奇艺怎么开启数据流量自动播放
  6. C语言预定义宏的使用
  7. 一文读懂数据平台、大数据平台、数据中台
  8. 调用feign接口时,如何往header中添加参数
  9. JDBC在spring中的使用
  10. 20180529 Linux配置ip 排查问题
  11. 中科大EPC课程爬取
  12. 黑苹果日记三(驱动)
  13. 中国队输球是有原因滴
  14. HAL库的串口基础学习(包含串口接收不定长数据的实现)
  15. android默认打开adb,android user 版本如何默认adb调试为打开(示例代码)
  16. SpringDataJPA入门
  17. Python-Opencv中高斯噪点和高斯模糊
  18. 关键路径法详解【CPM】
  19. MacBook M1 Flutter环境搭建
  20. [再寄小读者之数学篇](2014-11-20 计算二重积分)

热门文章

  1. php源码仿三一重工,织梦仿三一重工业大学气企业网站php源码
  2. java concurrent 例子_[Java Concurrent] 并发访问共享资源的简单案例
  3. java 方法 示例_Java扫描器具有示例的NextNextShort()方法
  4. tolowercase_Java String toLowerCase()方法与示例
  5. mysql数据库知识点梳理_MySQL数据库知识点整理 (持续更新中)
  6. pandas 根据列名索引多列数据_Pandas 数据聚合与分组运算[groupby+apply]速查笔记
  7. 【计算机网络】网络基础
  8. mysql row_id为什么是6字节?为什么是8字节
  9. 海量数据处理--位图(BitMap)
  10. Linux网络编程——tcp并发服务器(I/O复用之select