一、const常量

在 C++ 中,有两种简单的定义常量的方式:

1、使用 #define 预处理器。

#define LENGTH 10
#define WIDTH  5
#define NEWLINE '\n'

2、使用 const 关键字。

const int  LENGTH = 10;
const int  WIDTH  = 5;
const char NEWLINE = '\n';

注意:

a、常量必须初始化,且不能复制。

b、把常量定义为大写字母形式,是一个很好的编程习惯。

c、通过const_cast是可以修改常量值,但是便失去了定义常量的意义。

二、const指针

const 修饰指针有三种作用:三种写法不同,作用也不同。

1、指向const的指针,有两种写法

const int* p; (推荐)
int const* p;

p本身不用初始化它可以指向int变量,但它指向的内容的值是不能被改变的。

2、const指针

int* const p = 一个地址;// 因为指针本身的值是不能被修改的所以它必须被初始化

指针本身的值(即指向内容)是不能被修改,但它指向内容的值却是可以修改的。

3、指向const的const指针

const int* const p=一个地址;
int const* const p=一个地址;

此情况是这个指针本身(即指向内容)和它指向的内容的值都是不能被改变的

详细使用案例如下:(转载自:https://www.cnblogs.com/lihuidashen/p/4378884.html)

using namespace std;int main(int argc, char *argv[])
{int a=3;int b;/*定义指向const的指针(指针指向的内容的值不能被修改)*/ const int* p1; int const* p2; /*定义const指针(由于指针本身的值(即指向内容)不能改变所以必须得初始化)*/ int* const p3=&a; /*指针本身(即指向内容)和它指向的内容的值都是不能被改变的所以也得初始化*/const int* const p4=&a;int const* const p5=&b; p1=p2=&a; //正确*p1=*p2=8; //不正确(指针指向的内容的值不能被修改)*p3=5; //正确p3=p1; //不正确(指针本身(即指向内容)不能改变) p4=p5;//不正确 (指针本身(即指向内容)和它指向的内容的值都是不能被改变) *p4=*p5=4; //不正确(指针本身(即指向内容)和它指向的内容的值都是不能被改变) return 0;
}

三、const函数

const修饰函数有两种形式:函数名前与函数名后,意义也大不相同。

1、const位于函数名前,表示函数返回值是const常量

2、const位于函数名后,表示该函数为常函数,该函数不会改变成员变量值,一般用于只读函数。当成员函数被声明为const时,如果试图修改对象的数据,编译器将视为错误。

四、const对象

1、如果声明了一个指向const对象的指针,则通过该指针只能调用const方法(成员函数)。

class Rectangle
{pubilc:void SetLength(int length){itslength = length;}int GetLength() const {return itslength;} //成员函数声明为常量,则该函数是只读函数private:int itslength;int itswidth;
};
Rectangle* pRect = new Rectangle;const Rectangle * pConstRect = new Rectangle;     //指向const对象// pConstRect是指向const对象的指针,它只能使用声明为const的成员函数,如GetLength()。

2、 const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数。
3、 const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的。
4、const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查。
5、然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的。

五、const参数

1、如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。
2、const 只能修饰输入参数:如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。

a、对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如:

void Func(A a) {}//值传递需要大量复制操作void Func(const A &a){}//const引用传递,提升性能,同时保证安全

b、对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如:

void Func(int a) {}//常规写法void Func(const int &a){}//没有意义

六、const 返回值

1、如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如:

const char * GetString(void);char *str = GetString();//语句将出现编译错误:const char *str = GetString();//正确的用法

2、如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。

class A
{A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法

const修饰符的用法总结相关推荐

  1. C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08

    文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...

  2. [Reprint]C++函数前和函数后加const修饰符区别

    c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...

  3. C++ const修饰符和指针

    C++ const修饰符和指针 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年04月10日 const修饰符,是用来修饰变量,被const修饰符,修饰过的变量 ...

  4. 我对const修饰符应用的理解

    先说说我对编译器对const处理的理解:const修饰符定义一个常量,const变量在整个程序中只有一个拷贝.编译器会跟踪所有用到这个常量的地方,一旦发现任何一个操作可能会改变这个它是常量这个属性,那 ...

  5. re模块常用修饰符_在c语言中修饰符的用法

    展开全部 const 首先需要注意的是,const修饰的是在62616964757a686964616fe4b893e5b19e31333337396234它前面的类型,如果它前面没有类型,那它修 饰 ...

  6. C++成员函数中的const修饰符

    在一些C++源码中经常见到const修饰的函数,这里的const与放的位置无关,也就是下面三种写法是等效的,只不过通常使用第一种写法,可以编写函数进行测试,这里的const虽然写在了函数的位置,其实是 ...

  7. C语言中extern修饰符的用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 0. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...

  8. C++ const 修饰符

    C++ const 实施保护 概述 常对象 常对象成员 常成员函数 常数据成员 数据成员访问限制 常对象修改的限制 常指针 指向常变量的指针 指向对象的指针 小结 对象的常引用 总结 概述 const ...

  9. C++ const修饰符的简单介绍

最新文章

  1. 【响应式Web前端设计】new Option()函数的作用(三区联动)
  2. 多台服务器通过ssh 无密钥直接登陆主机
  3. Android之Caused by: java.lang.IllegalArgumentException: Failed to find configured root that contains
  4. explain for connection用法
  5. 人间值得!支付宝宣布平台上登记器官捐献人数:90后占比超一半
  6. GeoHash入门及应用
  7. 超级实用的浏览器插件
  8. Android 动态更换app图标
  9. html 超出shengl,逃不掉(GL)作者:乔禾若
  10. java 获取本机ip地址吗_java 获取本机ip地址
  11. 电脑眼病和干眼症的相关知识
  12. html链接变灰,怎么在HTML中设置点击超链接后变成灰色
  13. 图像处理中最大连通区域的求解
  14. 互联网晚报 | 9月14日 星期三 | ​理想汽车总裁5天抛售理想100万股港股;微信坚决抵制无底线追星;Phone15要改名?...
  15. PHP使用声网的页面录制、合流录制、单流录制
  16. 【jquery】Chosen.jquery.js 插件动态加载数据问题
  17. Multism14安装问题
  18. 迭代训练集,随机抽取batch_size数量的图片,报错索引超出范围index out of range
  19. TIA博途中如何通过画面编号+变量更改事件实现画面跳转?
  20. 量子计算机分解时间,量子计算机如何分解两个质数乘积

热门文章

  1. 【RT-Thread实战】EVB_MX+开发板 x STM32L431 (新建项目并打印信息)
  2. linux文件操作实验心得,操作系统实验心得(多篇).doc
  3. 单片机c语言cy,单片机c语言基础教程
  4. SUN被Oracle收购,一个时代结束了!
  5. 熟悉又陌生的arm 编译器详解(armcc/armclang)
  6. Linux学习笔记(3)基本命令Part3——用户和组管理
  7. 【C语言篇】结构体和其它数据形式
  8. 松鼠和棕熊的爆粉功能
  9. CRM项目开发【实操篇----市场活动模块】
  10. centos6.7下snort2.9.9.0+base+barnyard2的安装