【C++自我精讲】基础系列二 const
【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的更多相关文章
- 【C++自我精讲】基础系列四 static
[C++自我精讲]基础系列四 static 0 前言 变量的存储类型:存储类型按变量的生存期划分,分动态存储方式和静态存储方式. 1)动态存储方式的变量,生存期为变量所在的作用域.即程序运行到此变量时 ...
- 【C++自我精讲】基础系列一 指针与引用
[C++自我精讲]基础系列一 指针与引用 一 前言 指针.引用.指针与引用区别. 二 指针 变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...
- 【C++自我精讲】基础系列三 重载
[C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...
- 【C++自我精讲】基础系列六 PIMPL模式
[C++自我精讲]基础系列六 PIMPL模式 0 前言 很实用的一种基础模式. 1 PIMPL解释 PIMPL(Private Implementation 或 Pointer to Implemen ...
- 【C++自我精讲】基础系列五 隐式转换和显示转换
[C++自我精讲]基础系列五 隐式转换和显示转换 0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐 ...
- Java基础系列二:Java泛型
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...
- C#夯实基础系列之const与readonly
一.const与readonly的争议 你一定写过const,也一定用过readonly,但说起两者的区别,并说出何时用const,何时用readonly,你是否能清晰有条理地说出个一二三 ...
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
转自博客:https://www.cnblogs.com/CreateMyself/p/10604293.html 前言 本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义 ...
- es6基础系列二:Number
es6中关于Number类型的变化,主要有以下几点 Number.isInteger(新增,判断是否为整数) Number.EPSILON(新增,判断是否可忽略的误差) Number.MAX_SAFE ...
随机推荐
- C#中指针使用总结
C#为了类型安全,默认并不支持指针.但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式.在不安全模式下,我们可以直接操作内存,这样就可以使用 ...
- POJ 1860 Currency Exchange 毫无优化的bellman_ford跑了16Ms,spfa老是WA。。
题目链接: http://poj.org/problem?id=1860 找正环,找最长路,水题,WA了两天了.. #include <stdio.h> #include <stri ...
- Android Camera 预览图像被拉伸变形的解决方法【转】
问题描述: 预览图像被拉伸变形 问题原因: 由于预览图像大小跟SurfaceView 大小不一致引起 解决方法: 获取系统支持的所有预览尺寸[getSupportedPictureSizes],然后再 ...
- bzoj 3527: [Zjoi2014]力 快速傅里叶变换
题意: 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. fft的那一堆东西还是背不到啊...这次写虽说完全自己写的,但是还是在参见了以前fft程序的情况下调了很久,主要在如下几点 ...
- 【技术贴】破解Myeclipse10.7
程序用的是http://www.cr173.com/soft/58306.html这个破解程序,是英文版的中文版.使用起来非常爽,看下面 使用期间关掉Myeclipse 期间的第三步,点击激活,此时会 ...
- Performance Test of List<T>, LinkedList<T>, Queue<T>, ConcurrentQueue<T>
//Test Group 1 { var watch = Stopwatch.StartNew(); var list = new List<int>(); ; j < ; j++) ...
- android 世界各国英文简写代码 资源文件
今日又用到这段代码,忽然感觉到如果是第一次用的人肯定也会很麻烦.故在此上传一份.后人再用就不必重复做此工作.跟体育老师学过语文,见谅. 提供下载地址 http://download.csdn.net/ ...
- 【转】提供android 5.0 AOSP源码下载
http://blog.csdn.net/innost/article/details/41148335 android-5.0.tar.gz 115网盘礼包码:5lbcl16a1k7q http:/ ...
- 统计难题 HDOJ --1251
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- KEIL、uVision、RealView、MDK、KEIL C51区别比较
KEIL uVision,KEIL MDK,KEIL For ARM,RealView MDK,KEIL C51,KEIL C166,KEIL C251 从接触MCS-51单片机开始,我们就知道有一个 ...