常变量 const int a

常引用 const int &a

常指针 const int *a

const * int a

用法1:常量
    取代了C中的宏定义,声明时必须进行初始化(!c++类中则不然)。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。―《C++ Program Language》
    用const声明的变量虽然增加了分配空间,但是可以保证类型安全。
    C标准中,const定义的常量是全局的,C++中视声明位置而定。

用法2:指针和常量
    使用指针时涉及到两个对象:该指针本身和被它所指的对象将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const
    所以出现在 * 之前的const是作为基础类型的一部分:
char *const cp; //到char的const指针
char const *pc1; //到const char的指针
const char *pc2; //到const char的指针(后两个声明是等同的)
    从右向左读的记忆方式:
cp is a const pointer to char. 故pc不能指向别的字符串,但可以修改其指向的字符串的内容
pc2 is a pointer to const char. 故*pc2的内容不可以改变,但pc2可以指向别的字符串

且注意:允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋给一个普通的、非 const 对象的指针。

用法3:const修饰函数传入参数
    将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。
    通常修饰指针参数和引用参数:
void Fun( const A *in); //修饰指针型传入参数
void Fun(const A &in); //修饰引用型传入参数

引用&的作用:例如a=&b,那么表示a是b的别名,此时a和b的地址相同。在子函数中调用时,形参的改变就是实参的改变,不像C中需要用到指针来实现。

子函数调用时,并没有申请一个空间来存放形参b,也不用将实参a的值传给形参b,因此使程序运行更简化。

参考自https://blog.csdn.net/tom__chen/article/details/22206459

用法4:修饰函数返回值
    可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。

用法5:const修饰成员函数(c++特性)
const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;
const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。

不加引用的话,str则被复制一份,函数中对str的操作实质上是对其复制品的操作,所以即使在函数中修改了str,调用层的原str并不会被改变。
加了引用的话,传入的str即是调用层的实际参数,这样省却了复制过程,效率会有提高。但如果函数中修改了str,则原str也会改变,因为其实是同一个东西。
有时候为了追求效率,又希望避免改变原来的str,则可在引用的基础上加const修饰,这样函数中就不能再修改str的内容(否则会编译出错)

用法5:const与指针

int *ptr;
const int *ciptr;
int const *icptr;
int * const cptr;
const int * const cicptr;

上面是关于const与指针结合时的各种情况,这并不只是C++中经常遇到的问题,在C语言中也会有类似的讨论,虽然const并不是C语言中的关键字。
int * ptr 是指定义一个指向int 类型的指针ptr。
const int *ciptr 是指定义一个指向const int 类型的指针ciptr,这是const 限定的是(* ciptr),也就是对指针解引用,即const限定的就是数据本身,而非指针。所以ciptr是一个指向常int型数据的指针。
int const * icptr其实和上面的const int *ciptr是一致的因为const只是一个限定符,在int前还是后都 没有影响,他限定的仍然是(*icptr),并不是icptr,也就是icptr也是指向常int型数据的指针,也就是说在icptr这个指针看来,它指向的数据是常数,是不能改变的,但是是否真的不能改变,需要依据实际的类型的分析,只是不能通过这个指针来改变。也就是说该指针是一个自以为自己指向常量的指针。
int * const cptr 这时候我们还是结合const的位置分析,const限定的是cptr,cptr我们可以知道是一个指针,也就是说const限定的是一个指针,而不是指针指向的数据,也就是说这种定义实质上是定义一个常指针,也就是指针指向的地址是不变的,也就是cptr是不能被赋值的,不能采用这个指针指向其他的对象或者地址。但是这个地址中的数据并不是常数,是可以改变的,可以通过对*cptr进行修改。这种指针实质上也就使得指针的效果大大减小,并不常用。
const int * const cicptr 这种定义结合上面的分析我们知道是一个指向常量的常指针,也就说这个指针指向的地址是一个常地址,指针不能指向其他的对象或者地址。同时对指针cicptr来说,我指向的这个地址中的内容也是不能修改的,是一个常量,是不能修改的,但是该地址的数据能否修改还需要进行实际的分析。

参考自http://www.eepw.com.cn/article/201612/324522.htm

http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html

C++ const 引用 指针答疑相关推荐

  1. C++const 对指针和引用的作用

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065547 指 ...

  2. const修饰指针和引用的用法【转贴】

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. C++ Primer P0~P72 字面值常量、引用指针和const、constexpr、decltype

    看第一的章还觉得轻松,结果第二章开始就多了很多没学过的新内容,还是得做笔记. 字面值常量 形如42.'h'."str" 这类以字面形式存在,在编译时就能确定类型的值被称为字面值常量 ...

  4. 函数返回值为 const 指针、const 引用

    函数返回值为 const 指针,可以使得外部在得到这个指针后,不能修改其指向的内容.返回值为 const 引用同理. class CString {private:char* str; public: ...

  5. const引用const指针以及constexpr

    1.初始化 const对象一旦创建后的其值就不能改变,所以const对象必须初始化. 初始值可以是任意地复杂表达式: const  int  i = get_size();  // 正确:运行时初始化 ...

  6. 【C++---const引用】数组进行指针引用传递给函数error: non-const lvalue reference of type ‘int*‘ to an rvalue

    目录 原因 类型转换 手动转换 自动转换 关于临时量 关于常量引用(const的引用) const引用的对象不是不能被修改了吗,这里为什么被修改了? 不是说是const引用吗?为什么又变成了引用所绑定 ...

  7. 什么“取消引用”指针意味着什么?

    请提供一个解释示例. #1楼 指针是值的"引用"..很像库函数是对书的引用. "解除引用"电话号码实际上正在通过并检索该书. <code>int a ...

  8. C++中const引用和非const引用的使用注意

    今天学习时突然有疑惑,C++有了指针为何还要设计引用呢?后来看到一篇博客豁然开朗:为什么 C++ 有指针了还要引用? 总结一下: 代码更加简洁好看了 由于引用必须被初始化,并且之后也无法重新绑定其他对 ...

  9. 引用和const 引用的区别(转自chinaitlab)

    原文地址:http://c.chinaitlab.com/basic/747981.html 1)在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用必须初始化. 但是用 ...

最新文章

  1. 测试开发工程师技能图谱
  2. ASP.NET MVC 5 入门指南汇总
  3. 计算两个日期相差几年几个月
  4. java判断表是否存在_java怎么判断表是否存在?
  5. 全球与中国塑料废料粉碎机市场运营状况分析及投资风险评估报告2022-2027年版
  6. bvp解算器是什么_对数小史,以及为什么ln x的导数是1/x
  7. 搜狗高速浏览器打开网页没有声音怎么办
  8. XMind软件简易使用教程
  9. 多个安卓设备投屏到电脑_安卓手机投屏到电脑上的三种方法
  10. 因子分析模型 - 因子分析法原理与代码实现 -(Python,R)
  11. 蓝鸽集团云计算机,‎App Store 上的“蓝鸽教育云”
  12. 一起学习PySNMP——理解什么是MIB
  13. 68个经典励志小故事|哲理小故事,让你终身受益(1)
  14. Flutter报错: type ‘double‘ is not a subtype of type ‘int?‘或type ‘int‘ is not a subtype of type ‘double
  15. 【板子】 0-1背包问题 一维数组
  16. 用Javascript实现放大镜效果
  17. 中台战略-第五章、中台建设方法论
  18. FFMPEG批量绿幕色度抠像BAT脚本实现
  19. 美团跑腿地址选择器流程图[小程序]
  20. 一个双非计算机学生的长远规划(考研篇)

热门文章

  1. linux怎么查看sklearn版本,Sklearn——Sklearn的介绍与安装
  2. 云服务器如何链接本地打印机_利用FileZilla搭建云服务器FTP服务端和本地客户端...
  3. mongodb mysql 写_MySQL和MongoDB语句的写法对照
  4. 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...
  5. java内部类练习题,学习笔记——Java内部类练习题
  6. java 观察者模式_重学 Java 设计模式:实战观察者模式「模拟类似小客车指标摇号过程,监听消息通知用户中签场景」...
  7. Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)
  8. mac os11以下安装Xcode
  9. 计数方法应用于PTB数据集
  10. c++ 命名空间的using声明