【C++自我精讲】基础系列二 const

0 前言

分三部分:const用法、const和#define比较、const作用。

1 const用法

const常量:const可以用来定义常量,不可改变,const常量在定义时必须初始化(extern修饰时是特例)。

//const常量
const int Number = 100;
extern const int Number; 

const指针:

1)const出现在*号左边,表示被指物是常量(不可以改变);注意:const写在类型之前和写在类型之后且*号之前是一样的。

2)const出现在*号右边,表示指针自身是常量(不可以改变);

3)const出现在*号两边,表示被指物和指针两者都是常量(不可以改变)。

//const指针
char name[] = "joinclear";
char* pName = name;             //指针和所指物都可以改变
const char* pName = name;       //指针可以改变,指针所指物不可以改变
char const* pName = name;       //同上
char* const pName = name;       //指针不可以改变,指针所指物可以改变
const char* const pName = name; //指针和所指物都不可以改变

const引用:初始化右值一般只是个常量,所以只有常量引用可以有初始化右值。

//const引用
int i = 100;
int &j = i;    //引用
int &j = 200;  //错误,引用不能改变右值
const int &k = 200;  //const引用可以改变右值

const函数形参:const只能修饰输入参数,不能修饰输出参数。

1)对于内部数据类型的输入参数,没必要将“值传递”方式改为“const引用传递”,因为“值传递”是,函数会自动产生临时变量用于复制该参数,无需const。

void Fun(int i)       //OK
void Fun(const int i) //没必要

2)当输入参数是“指针传递”是,为了防止函数体内改变此指针指向的值,可以加const修饰。

void StringCopy(const char *strSource); //strSource不能改变

3)对于非内部数据类型的输入参数,应将“值传递”方式改为“const引用传递“。

void Func(CTest a);        //函数体内会产生CTest的临时对象用于复制a,临时对象又会经过构造、复制、析构,很耗时
void Func(CTest &a);       //引用,不产生临时对象,但"引用传递"有可能改变a
void Func(const CTest &a); //加const不会改变a

const函数返回值:const修饰函数返回值。

1)返回值是“值传递”方式,不用加const修饰。因为函数会把返回值复制到外部临时的存储单元,加const修饰没必要。

int Fun(int i)        //OK
const int Fun(int i)  //没必要

2)返回值是“指针传递”方式,可以加const修饰。意思为函数返回值指针所指内容不能改变,此时此返回值也只能赋给const修饰的同类型指针。

const char * GetString(void);
const char *str = GetString();

const类成员变量:只在某个对象生存期内是常量,对于整个类是可变的,因为类可以创建多个对象,不同的对象其const类成员变量的值是可以不同。

1)const类成员变量,不能在类声明中初始化。

class A
{const int size = 100;  //错误
};

2)const类成员变量,只能在类构造函数的初始化表中进行初始化。

class A
{A(int size);     const int size ;
};
A::A(int i) : size(i) //构造函数初始化列表
{...
}

const类成员函数:当类成员函数,不会修改数据成员时应该声明为const成员函数。

class A
{
public:int GetNum() const; //const成员函数
private:int num_;
};int A::GetNum() const
{num_ = 100;; // 错误,num_不能改变return num_;
}

2 const和#define比较

1)const常量有数据类型,编译器可以对前者进行类型安全检查;而#define常量没有数据类型,编译器只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。

2)const可定义局部变量,作用域仅限于函数体内;#define常量,即使在函数体内,作用域也是全局的,为从定义处到文件结束,除非用#undef取消定义。

3 const作用

1)定义const常量,不可改变,能够节省内存空间,代替#define。

2)编译器能进行类型安全性检查,消除部分隐患。

3)可以保护被修饰的内容,防止意外修改,能够增强程序的健壮性。

4)能够提高效率,安全。

转载于:https://www.cnblogs.com/snake-hand/p/3180352.html

【C++自我精讲】基础系列二 const相关推荐

  1. 【C++自我精讲】基础系列三 重载

    [C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...

  2. 视频教程-2021软考系统集成项目管理工程师视频教程精讲 基础知识(下)-软考

    2021软考系统集成项目管理工程师视频教程精讲 基础知识(下) 河北师范大学软件学院优秀讲师,项目经理资质,担任操作系统原理.软件工程.项目管理等课程教学工作.参与十个以上百万级软件项目管理及系统设计 ...

  3. 视频教程-2021软考系统集成项目管理工程师视频教程精讲 基础知识(上)-软考

    2021软考系统集成项目管理工程师视频教程精讲 基础知识(上) 河北师范大学软件学院优秀讲师,项目经理资质,担任操作系统原理.软件工程.项目管理等课程教学工作.参与十个以上百万级软件项目管理及系统设计 ...

  4. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

  5. c++图形中如何判断鼠标点击在一条直线上_中考数学常考题型精讲精练系列:函数图象上点的存在性问题中的距离与面积...

    函数图象上点的存在性问题中的距离与面积(下)第1段 函数图象上点的存在性问题中的距离与面积(下)第2,3段 函数图象上点的存在性问题中的距离与面积(下)第4段 判断函数的图像是中考的重要考点,主要有以 ...

  6. Javascript学习总结 - JS基础系列 二

    简述 本系列将持续更新Javascript基础部分的知识,谁都想掌握高端大气的技术,但是我觉得没有一个扎实的基础,我认为一切高阶技术对我来讲都是过眼云烟,要成为一名及格的前端工程师,必须把基础打扎实了 ...

  7. WPF基础系列二:控件简介

    控件简介 文章目录 控件简介 前言 一.控件 二.控件类型 三.控件详解 1.ContentControl 类 2.HeaderedContentControl 类 3.ItemsControl 类 ...

  8. Java 基础系列(二十二) --- Maven到底是什么? 如何使用

    Maven 1 以前 2 现在 2.1 背景 2.2 新建 Maven 2.3 解读 Maven 项目 2.4 使用 Maven 2.4.1 管理依赖 2.4.2 打包构建 1 以前  举个例子, 在 ...

  9. py基础系列(二):python语言基础(上)

    py 基本数据类型 整型 浮点型 复数型(complex) 逻辑型(布尔型) 字符串 字符串的表示 转义字符 字符串的格式化 变量 关键字和标识符 变量 运算符与表达式 运算符 (1)算数运算符 (2 ...

最新文章

  1. DATAGRID学习
  2. 一直用PDO,PHP中操作MYSQL数据库常用函数还记得不
  3. linux--gdb调试
  4. 动态改变ListView布局
  5. 小汤学编程之jQuery学习day03——事件、效果、插件
  6. selenium webdriver学习(八)------------如何操作select下拉框(转)
  7. 2021-03-05小根堆
  8. Python 带你来一次说走就走的环球旅行
  9. route-policy和ACL组合时permit和deny的作用
  10. 高并发→秒杀功能、难点共有数据排队、优化方案
  11. sitemap.xml 静态和动态生成页面 shopnc二次开发 动态生成sitemap.xml
  12. H3C官方培训课件大全
  13. 【深度学习】Mask DINO四部曲—DETR潘多拉魔盒的正确打开方式
  14. GemCraft Labyrinth:超耐玩的在线flash塔防游戏
  15. Windows注册服务的两种方式,并设置服务开机自启
  16. 如何高效访问OneDrive个人存储空间?三种方法
  17. 高通QCA平台常见wifi命令使用
  18. Discuz!论坛部署
  19. SAP业务顾问必备的技术能力
  20. 先进PID控制MATLAB仿真学习记录(一)

热门文章

  1. 2022-2028年中国液化石油气(LPG)行业投资分析及前景预测报告
  2. 数据结构(04)— 线性顺序表实战
  3. 2021年中国服装行业分析报告-产业规模现状与发展规划趋势
  4. 【JavaWeb】servlet与http请求协议
  5. visual2017中给C#项目添加配置文件
  6. 机器都会学习了,你的神经网络还跑不动?来看看这些建议
  7. LeetCode简单题之将找到的值乘以2
  8. TVM量化路线图roadmap
  9. Camera噪声问题
  10. 自定义算子高性能开发