博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】C++ const关键词用法
阅读量:4555 次
发布时间:2019-06-08

本文共 2251 字,大约阅读时间需要 7 分钟。

【转载】转自 https://www.cnblogs.com/chogen/p/4574118.html

const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

1. 修饰常量

用const修饰的变量是不可变的,以下两种定义形式在本质上是一样的:

const int a = 10;int const a = 10;

2. 修饰指针

如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
因此,推荐使用int const* p,而不是使用const int* p(虽然两者意义完全一样),这样更容易理解。

int a = 10;const int* p = &a;            // 指针指向的内容不能变int const* p = &a;            // 同上int* const p = &a;            // 指针本身不能变const int* const p = &a;      // 两者都不能变int const* const p = &a;      // 同上

3. 修饰引用

以下两种定义形式在本质上是一样的:

int a = 10;const int& b = a;int const& b = a;

4. 修饰函数参数

用const修饰函数参数,传递过来的参数在函数内不可以改变。

void func (const int& n){     n = 10;        // 编译错误 }

5. 修饰函数返回值

用const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同。

const int* func()   // 返回的指针所指向的内容不能修改{    // return p;}

6. 修饰类成员变量

用const修饰的类成员变量,只能在类的构造函数初始化列表中赋值,不能在类构造函数体内赋值。

class A{public:    A(int x) : a(x)  // 正确    {         //a = x;    // 错误    }private:    const int a;};

7. 修饰类成员函数

用const修饰的类成员函数,在该函数体内不能改变该类对象的任何成员变量, 也不能调用类中任何非const成员函数。

class A{public:    int& getValue() const    {        // a = 10;    // 错误        return a;    }private:    int a;            // 非const成员变量};

8. 修饰类对象

用const修饰的类对象,该对象内的任何成员变量都不能被修改。

因此不能调用该对象的任何非const成员函数,因为对非const成员函数的调用会有修改成员变量的企图。

class A{ public:    void funcA() {}    void funcB() const {}};int main{    const A a;    a.funcB();    // 可以    a.funcA();    // 错误    const A* b = new A();    b->funcB();    // 可以    b->funcA();    // 错误}

9. 在类内重载成员函数

class A{public:    void func() {}    void func() const {}   // 重载};

10. const与宏定义的区别

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

const常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
另外,编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

#define PI 3.1415926535const double PI = 3.1415926535;

11. const_cast

const_cast运算符用来修改类型的const或volatile属性。

一、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
二、常量引用被转换成非常量的引用,并且仍然指向原来的对象。

void func(){    const int a = 10;    int* p = const_cast
(&a); *p = 20; std::cout<<*p; // 20 std::cout<

 

转载于:https://www.cnblogs.com/ladawn/p/8444021.html

你可能感兴趣的文章
Jolt:软件业的奥斯卡
查看>>
机器学习课程笔记 (1)
查看>>
基础数据类型 格式化输出
查看>>
第九周作业
查看>>
解析大型.NET ERP系统 单据编码功能实现
查看>>
互联网创业应该如何找到创意 - RethinkDB创始人Slava Akhmechet的几点建议
查看>>
互联网技术架构给我们的启示
查看>>
hbase redis mysql重要知识点总结
查看>>
取数字(dp优化)
查看>>
web app builder arcgis 自定义弹窗
查看>>
第六天冲刺
查看>>
Golang学习 - strconv 包
查看>>
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
查看>>
imx6 system boot
查看>>
[SDOI2017]硬币游戏
查看>>
Azure 网站、云服务和虚拟机比较
查看>>
Windows 10在2018四月更新中默认安装了OpenSSH客户端
查看>>
jQuery常用函数
查看>>
一个忙着找实习工作的大三在校生的真实感受!!!
查看>>
Linux 下的 scp
查看>>