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

时间:2021-09-22 21:50:43

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

0 前言

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

1 const用法

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

//const常量
const int Number = ;
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 = ;
int &j = i; //引用
int &j = ; //错误,引用不能改变右值
const int &k = ; //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 = ; //错误
};

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_ = ;; // 错误,num_不能改变
return num_;
}

2 const和#define比较

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

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

3 const作用

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

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

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

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

【C++自我精讲】基础系列二 const的更多相关文章

  1. 【C++自我精讲】基础系列四 static

    [C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...

  2. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...

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

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

  4. 【C++自我精讲】基础系列六 PIMPL模式

    [C++自我精讲]基础系列六 PIMPL模式 0 前言 很实用的一种基础模式. 1 PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implemen ...

  5. 【C++自我精讲】基础系列五 隐式转换和显示转换

    [C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...

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

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

  7. C#夯实基础系列之const与readonly

    一.const与readonly的争议       你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...

  8. 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)

    转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...

  9. es6基础系列二:Number

    es6中关于Number类型的变化,主要有以下几点 Number.isInteger(新增,判断是否为整数) Number.EPSILON(新增,判断是否可忽略的误差) Number.MAX_SAFE ...

随机推荐

  1. eclipse调试(debug)的时候,出现Source not found,Edit Source Lookup Path,一闪而过

    问题描述 使用Eclipse调试代码的时候,打了断点,经常出现Source not found,网上找了半天,大部分提示点击Edit Source Lookup Path,添加被调试的工程,然而往往没 ...

  2. 移动开发--Hybrid和Native混合开发-->HybridApp 、NativeApp、WebApp

    1.1.     APP三种开发模式 智能手机之普及不用多说,手机APP渗投到各个行业:电商(淘宝.京东等).金融(各手机行业.P2P借贷等).医疗(智慧医疗).交通(滴滴.Uber等).教育(慕课网 ...

  3. “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法

    在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示 ...

  4. oracle数据库解析json格式

    随着非关系型数据大规模使用,以json格式产生的数据也出现在我所管理的Oracle数据库的CLOB字段里面,使用过程中就需要解析出指定键的值. 使用了最新版本 如果Oracle版本为12.1.0.2的 ...

  5. 使用window2003安装邮件服务器最新实际操作记录

    关于使用windows 2003自带的服务组件来安装简单的pop3 协议邮件服务器网上教程很多,可以搜索出来,就是安装IIS选中smtp和添加window是组件的应用程序服务器,这点这里不多说. 安装 ...

  6. golang的ssh例子

    package main import ( "github.com/dynport/gossh" "log" ) func MakeLogger(prefix ...

  7. CodeForces 732D Exams (二分)

    题意:某人要考试,有n天考m个科目,然后有m个科目要考试的时间和要复习多少天才能做,问你他最早考完所有科目是什么时间. 析:二分答案,然后在判断时,直接就是倒着判,很明显后出来的优先,也就是一个栈. ...

  8. visual studio 2015 删除空行 ,缩进css

    查找  ^(?([^\r\n])\s)*\r?$\r?\n

  9. MD中bitmap源代码分析--SYNC IO和RAID5的补充

    最近在做bwraid的R6的设计工作,需要调研一下bitmap下刷磁盘的IO属性(是否为SYNC IO),还有raid5中bitmap的存储和工作方式. 1.bitmap刷磁盘是否为 SYNC IO? ...

  10. 201521123022 《Java程序设计》 第九周学习总结

    1.本章学习总结 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 Q1.1 截图你的提交结果(出现学号) Q1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何 ...