C++中的const用法
本文参考《C++编程思想》第八章内容,看过这本书的,请无视以下内容。
在C++中,const一共有四个作用,分别用于值替代、指针、函数参数和返回以及类。
一 值替代
1.const最初的动机就是值替代,也就是说,以前在C语言里,值替代的典型用法是这样的:
#define BUFSIZE 100
现在可以用:
const int bufsize = 100;
这样替换的好处是可以进行类型检查,避免出现一些问题。
2.这样定义的const的值在编译期间就能确定,因此可以用于定义数组,比如:
char buf[bufsize];
3.const变量定义时必须初始化。应该这样:
const int a =100;
如果只是声明:
const int a;
会报错的,不信你试试?
4.原因是C++中const变量默认的是内部连接,也就是在变量所在文件内有效,相当于static的效果,因此在不同的文件中定义同名的const变量是没有任何问题的。但是如果多个文件要共用同一个const变量应该怎么办呢?在某一处定义并初始化,像这样:
extern cons tintx = 1;
并在其他文件里声明:
extern constint x;
所以,const变量在定义时就得初始化的原因就是:把定义和声明区别开。
二 指针
1.指向const的指针
const int * u;
int const * u;
这两者的意思都是:u是一个int型指针,指向一个constint。也就是指向常量的指针。
2.const指针
int d = 1;
int * const w =&d;
w为一个int型指针,指向一个int值,w指针本身不变。
Ps:为什么有两条语句,参照上文,const变量定义时需要初始化。
3.结合第一点和第二点,可以定义一个指针不变并且指针指向的值也不变的const量,怎么写呢,你猜?
4.可以将一个非const变量的地址赋给const指针,但不能将一个const值的地址赋给一个非const指针。
int d = 1;
const int a = 1;
const int * b =&d; //right
int * c =&a; //wrong
三 函数参数和返回类型
1.const变量按值传递,则该值不能改变。
void f1(constint i) {i++; //wrong
}
2.const量作为返回值时,没什么意义。因为起不到想要的效果,你可以试一下。
3.const指针作为函数参数的情况。这种情况比较复杂,只需要记住,对于用户自定义的数据类型,当用该类型的引用作为函数参数的时候,一定要加const。
四 类
1.const类型的成员变量及其初始化
class Integer {int i;
public:Integer(int ii = 0) ;void print();
};Integer::Integer(int ii = 0) : i(ii) {}
void Integer::print() { cout << i << ' '; }
2.编译期间类里的常量。必须在定义的时候初始化。
class StringStack {static const int size = 100;const string* stack[size];int index;
public:StringStack();void push(const string* s);const string* pop();
};StringStack::StringStack() : index(0) {memset(stack,0,size * sizeof(string *));
}
void StringStack::push(const string* s) {if(index < size)stack[index++] = s;
}
const string* StringStack::pop() {if(index > 0) {const string* rv = stack[--index];stack[index] = 0;return rv;}return 0;
}
3.const对象的概念是对象的数据成员在其生命周期内不被改变。因此,它只能调用const成员函数,不能调用非const成员函数,因为那有可能改变数据成员。
class Quoter {int lastquote;
public:Quoter();int lastQuote() const;
};Quoter::Quoter() {lastquote = -1;srand(time(0));
}
int Quoter::lastQuote() const {return lastquote;
}
C++中的const用法相关推荐
- C语言返回值是const类型,C++中const用法总结
1.1.1. 定义普通常量 使用#define来定义常量也是常用方法,但const也可以用来定义常量,在[Effective C++]中建议使用const代替#define来定义常量,因为const定 ...
- C++中const用法总结
2019独角兽企业重金招聘Python工程师标准>>> . const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE cons ...
- c/c++中const用法总结
const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令 **************常量必须被初始化************************* cons的作用 ...
- 【C++】C/C++ 中 static 的用法全局变量与局部变量
C/C++ 中 static 的用法全局变量与局部变量 目录 1. 什么是static? 1.1 static 的引入 1.2 静态数据的存储 2. 在 C/C++ 中static的作用 2.1 总的 ...
- C++中的const关键字(zz)
[补充]mutable关键字 有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现.这样的应用,比如记录各种操作的调用次数,这时,即使在co ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- php定义枚举,PHP中Enum(枚举)用法实例详解
本文实例讲述了PHP中Enum(枚举)用法.分享给大家供大家参考,具体如下: PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持. (1 ...
- C/C++常用宏定义,注意事项,宏中#和##的用法
总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...
- JAVA中Final的用法
JAVA中Final的用法 1. 修饰基础数据成员的final 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改.如java.lang.Math类中的 ...
最新文章
- linux终端字体大小6,[adminitrative][archlinux][setfont] 设置console的字体大小
- 英语音标 [j] yes
- matlab中的方波信号图片_电气信息类专业课程之matlab系统仿真 第十章 DBPSK调制解调器(9)...
- C#通用类Helper整理
- MySQL子查询的使用
- 鸿蒙系统基础是云计算吗,国内两大系统横空出世,鸿蒙不算啥,这系统才叫牛...
- Archlinux 升级 pacman 时遇到的问题及其解决
- linux学习入门之Linux系统目录结构
- 西门子S7-200 SMART编程软件下载
- 中文字体的英文名称(宋体 微软雅黑)
- CRC校验算法的Verilog实现
- bak 服务器备份文件怎么恢复,bak文件怎么还原
- python:兔子繁殖问题
- 安装linux系统提示acpi,ACPI引起linux系统无故重启
- [好消息]大连.NET俱乐部QQ群开放注册~~~注册有好礼!
- VS2010连接数据库的操作(SQLServer2005/2008 以及Access2007/2003等)
- 七牛云 Java Web上传图片
- 什么,你还在一条一条的insert?
- jsp电影评论网站ssh框架
- 如何学习python
热门文章
- stable diffusion webui mov2mov
- matlab标准化还原,1.2基于MATLAB的数据预处理(标准化变换部分)
- c1000k 高性能服务器构建技术,C1000K高性能服务器构建技术.ppt
- 2007年十二星座运势
- 【计量经济学导论】13. 虚拟变量与双重差分
- 使用canvas绘制小黄人
- SpringBoot通过AOP实现系统日志记录(一)-Controller层日志监控
- Error: only one instance of babel-polyfill is allowed
- vue中实现锚点定位以及平滑滚动到指定位置
- VC编程中经常能遇到LNK2005错误