linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux基础建设 >

C++中的const 深入理解

时间:2019-05-13  来源:未知  作者:admin666

const是C++中一个让人非常容易误解的特行。

它最简单的用法是被它修饰的变量被称为常量,一旦被初始化后就不能再被修改。但,有时const又是非常复杂,甚至让很多的程序员感到“可拍”。

const的简单用法

最简单的用法是声明一个常量,这是在C/C++出现之前就有的一个编程语言的特性。
 声明常量只需要在变量前添加const修饰符即可,但是在声明的同时要进行初始化,因为常量是不能被修改的。
const int a = 10; //声明a为常量,其值为10,不可被修改

将那些在程序编译后就不在改变的量设为常量是非常有用的。相对于C中的#define 预处理指令,const更易于理解,并且不像#define是在编译器处理之前对源代码进行文本处理,const是被编译器所支持的,因此在遇到错误时可以得到更多的有用信息。

const也是可以修饰指针的,这时候就要小心了,要注意const修饰的是指针本身,还是修饰指针所指向的值。
const int *a;
int const *a;

上面声明了一个指针变量a,指向一个整型常量(也就是不能通过指针a修改其指向的值,因为它指向的是一个常量,但是可以改变a的指向)。
int *const a;

这里声明的a是一个常量指针,指向一个整型变量(可以通过指针a修改其指向整型的值,但是不能将指针重新指向其他的变量)。
int const * const a;

a是一个常量指针,指向一个整型常量。
const是左结合的,也就是会修饰它左边,当它左边没有没有可修饰的时候它修饰就是它右边的。

const修饰函数的返回值

当一个指针或者引用指向的是一个常量时这在某些情形下是非常有用的,特别函数是作为函数的返回类型时是很有作用的。既可以享受到指针或者引用传值的便利性又不用担心通过指针或者引用修改具体的值。
 例如
char* f(){
    return "some text";
}

假如没有const的修饰,可以又下面的代码
f()[0] = 'h';

这在某些情况下可能导致程序出现错误,但是如果使用了const修饰
const char* f(){

}

在通过返回的指针修改其指向的值就会到的编译错误,可以避免上述情况的发生。

const修饰函数的参数

在C/C++中,通过值传递的只是实参的一个copy,在函数中做的任何修改都不会影响到实参。通过指针或者引用传递的参数却可以在函数中修改其具体的值,但是这又引发了一个问题,有些值使用指针或者引用传递的消耗比较低(例如,结构体或者类作为函数参数时,使用指针或者引用传递就省掉了copy的过程)所以要使用指针或者引用来传递参数,但是却不希望在函数体内通过指针(或者引用)修改传递过去的值,这时候就可以使用const修饰参数。
void f(const string& str){

}

const修饰类成员

使用const可以修饰类的成员变量,const类型的成员变量已经初始化就不能再被修改,并且要将其放在初始化列表中初始化。
cosnt也可以修饰类的成员方法,经过其修改的方法不能改变类的状态。
class c1{
    int m;
    void f() const;
}

void c1::f()const {
    m += 1;
}

上述代码会出现编译错误,因为const方法修改类中的成员变量。

结束语

公司实习有2个周了,感觉收获确实确实很大,平常的理论学习应用到实际中还是有很大的不同。

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

友情链接
  • Linux Lite用户第一个尝试Linux Kernel 5.1,以下是如何安装它
  • Ubuntu 18.04 Linux上安装Etherpad,基于Web的实时协作编辑器
  • Kakoune - 受 Vim 启发的代码编辑器
  • Slimbook - Ubuntu的电池优化工具
  • 如何在Linux中创建磁盘分区
  • Oracle 经典面试题分享
  • 如何使用Vi/Vim编辑器删除文件中的所有文本
  • Vis - 类似Vim的文本编辑器
  • MySQL 正则表达式详解
  • 关于 Linux系统用户、组和权限管理
  • Rust更换Crates源为国内中科大镜像源
  • MySQL数据库优化
  • 命令行中的 vi 模式
  • AMP - 受Vi/Vim启发的Linux终端文本编辑器
  • MySQL查询表与表字段的信息
  • Ubuntu 18.04源码安装caffe步骤
  • 一份比较全的 VS Code 快捷键
  • MySQL 中的日期时间类型
  • Ubuntu 18.04源码编译安装OpenCV 4.0步骤
  • VMware虚拟机下Ubuntu Cheese黑屏问题解决方法
  • Oracle 分页查询与数据去重实例
  • Aria2 - 适用于Linux的多协议命令行下载工具
  • Ubuntu 18.04.2下编译安装OpenCV 3.4.0 过程
  • Oracle中order by造成分页错误
  • 如何在Ubuntu 18.04/16.04/Linux中安装FreeCAD 0.18
  • git clone速度太慢的解决办法(亲测还有效)
  • Hive0.13.1介绍及安装部署
  • 从命令行关闭Linux计算机的5种方法
  • 简单测试latch nowilling等待模式案例
  • Python面向对象之私有属性和方法
  • TypeScript 中的方法重载
  • Python面向对象之类属性类方法静态方法
  • TypeScript 中非代码模块的导入
  • Python面向对象之单例模式
  • 理解 KMP 算法
  • Python3使用TCP编写一个简易的文件下载器
  • 一道C语言面试题:大整数乘法
  • Python Numpy 数组的基本操作示例
  • Python中模块互相调用的例子
  • Python多进程编程详解
  • Python实现全排列算法
  • Python函数search()和match()的区别
  • 使用Python的matplotlib绘制广义mandelbrot集
  • 如何使用Python删除一个文件或文件夹
  • 使用Python的matplotlib绘制lozi混沌映射吸引子
  • 双色球走势图500期图
  • 福彩3d预测分析
  • 金沙中文
  • 一肖彩经
  • 赌大小
  • 855a网页游戏