【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. 服务器慢 mysql-bin.000001文件占满磁盘的原因与解决

    发现 VPS 服务器上的网站反应超级慢,简单的重启.重启各主要服务,发现mysql 的反应极其不正常. 一方面是问题,这与站点访问量有关.开始时从mysql 的配置文件 my.cnf 考虑,但志文工作 ...

  2. u-boot Makefile整体解析

    一.概述   1.理解u-boot的makefile需要的准备 linux常用命令.shell脚本基础知识.makefile脚本基础知识 2.Makefile的元素 万变不离其宗,无论工程多么复杂,文 ...

  3. Java 文件操作大全

    Java 文件操作大全 //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPat ...

  4. How to new a screen in linux

    screen -R -D: create a screen Ctrl + A & Ctrl + D: leave a screen

  5. E.164 Format

    From http://en.wikipedia.org/wiki/E.164 E.164 is an ITU-T recommendation, titled The international p ...

  6. maven 根据不同的环境打war包-->资源文件的处理方式

    发现犯的错误: 1. 指定了testResource 文件夹与resource 为同一个文件夹.导致不论在resource 里面如何过滤文件,都不起作用.资源文件本来就是共享的.不必这样指定. 2. ...

  7. Android sqlite 数据库在java代码中的增删改查

    private void queryPerson(PersonSQLiteOpenHelper personSQLiteOpenHelper) { SQLiteDatabase sqLiteDatab ...

  8. USB Type-C“三剑客”: 连接器、控制器和电缆

    USB Type-C™是最新的有关电缆布线的USB连接器标准.您会看到,从笔记本电脑.智能手机.闪存到视频系统,这些设备上有一个小型可逆的Type-C连接器.由于Type-C电缆既可以给主机和设备提供 ...

  9. 【Xamarin 挖墙脚系列:IOS 开发界面的3种方式】

    原文:[Xamarin 挖墙脚系列:IOS 开发界面的3种方式] xcode6进行三种基本的界面布局的方法,分别是手写UI,xib和storyboard.手写UI是最早进行UI界面布局的方法,优点是灵 ...

  10. UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...