const1

1. const的最初动机是取代预处理器#define来进行值替代

#define只做些文本替代,它既没有类型检查概念,也没有类型检查功能,所以预处理器的值替代会产生一些问题。

这些问题在C++中可以通过使用const来避免。

2. C++中的const默认为内部连接(internal linkage)

const仅在被定义过的文件里才是可见的,而且在连接时不能被其他编译单元看到(默认情况)。

3. 当定义一个const时,必须赋一个值给它

也就是说,在定义的时候必须要进行初始化。

4. const要么保存在符号表中,要么由编译器为其分配存储空间

通常C++编译器并不为const创建存储空间,而是把这个定义保存在符号表里。

只有以下两种情况会为const创建存储空间:

1)进行取该const的地址的操作(包括把该const传递给一个带引用参数的函数)

2)该const被定义为extern。这时候表示要在其他编译单元中用到它,因此必须要用存储空间

5. 编译期间的const

通常const是一个编译期间的const,可以在编译期间使用。

比如一个const int用于确定另一个数组的大小:

const int bufsize = 100;

char buf[bufsize];

注意:这段代码在C++是正确的,但是在C中是错误的。C中const的意思是“一个不能改变的普通变量”,const在C中总是占用存储的。C编译器不能把const看成一个编译期间的常量

下面几种情况const不能再编译期间使用:

1)其值在编译期间是不知道的。比如如下情况:

const char c = cin.get();

c的值在编译期间是不知道的,这意味着需要存储空间,而且编译器不会在符号表中保留它的任何信息。因此c在编译期间是不可用的。

2)当const用于集合(数组、结构体等)的时候。比如如下情况:

const int i[] = {1, 2, 3, 4};

编译器不会复杂到把一个集合保存到符号表中,因此必须分配内存。

在这种情况下,const意味着“不能改变的一块存储空间”,但是不能在编译期间使用它的值。比如下面语句对i的使用就是错误的:

float f[i[3]];

这里试图使用i中的元素来确定另一个数组的大小,然后编译期间i是不能使用的,因此这里编译器会报错。

6. const的外部引用

由于C++中的const默认为内部连接,所以不能在一个文件中定义一个const,而在另外一个文件中又把它作为extern来引用。

为了使const成为外部连接以便让另外一个文件可以对它引用,必须明确地把它定义成extern,如下:

extern const int x = 1; (1)

通过对它初始化并指定为extern,我们强迫给它分配内存。初始化使得它成为一个定义而不是一个声明。而下面的语句:

extern const int x; (2)

是在另外的文件中对该const的声明,表示要引用其他文件中的一个const变量x。

注意语句(1)和(2)的区别,(1)是对const的定义;(2)是在另外的文件中对const的声明,表示要引用其他文件中的const变量x

还有一个要注意的地方,在4中说过,当一个const被定义为extern时,就会为它分配存储空间。那么之后对该const的使用不再通过符号表,而是通过其存储空间的地址

7. 常量折叠(const folding)

当一个const没有被编译器分配存储空间时,编译器在编译时会通过必要的计算把一个复杂的常量表达式通过缩减简单化。这个操作称为“常量折叠”

比如:

const int i = 10 * 5;

编译器会在符号表中存储类似“i=50”的信息。这个是#define做不到的,预处理器只是简单地进行文本替换。

8. const与指针

1)指向const的指针(不需要初始化):

const int* u;

或者 int const* v;

u是一个指针,它指向一个const int。

2)const指针(需要初始化):

int d = 1;

int* const w = &d;

w是一个指针,这个指针是指向int的const指针。

时间: 2024-10-10 14:04:34

const1的相关文章

ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述

es7语法比较少,只占了一点点 ES 6 新特性一览:https://frankfang.github.io/es-6-tutorials/ 我用了两个月的时间才理解 let   https://zhuanlan.zhihu.com/p/28140450 原文地址:https://www.cnblogs.com/wangjunwei/p/11546269.html

mysql 索引和查询优化

对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找. 例如:假 设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引.查询语句select * from t1 where c1=1也能够使用该索引.但是,查询语句select * f

Java--分支语句、循环、数组、控制台输入语句、常用数学函数

**-----本章节-----** 1.分支语句 2.循环 3.数组 4.控制台输入语句 5.部分常用的数学函数 ============================================================== 一分支语句 1.概念 (1)分支语句又称条件语句条件语句使部分程序可根据某些表达式的值被有选择地执行. (2)Java编程语言支持双路 if和多路 switch 分支语句. ===========================================

《深入Java虚拟机》笔记:指令集 (转)

<深入Java虚拟机>笔记:指令集 指令 含义 iconst_m1 把int型常量-1压入栈中 iconst_0 把int型常量压入栈中 fconst_1 把float型常量1压入栈中 lconst_2 把long型常量2压入栈中 dconst_3 把double型常量3压入栈中 bipush byte1 把byte1转换成int型压入栈中 sipush byte1,byte2 把byte1,byte2组成的short转换成int压入栈中 aconst_null 把空对象压入栈中 ldc in

Excel中的VBA编程

目的:有时我们需要对Excel文件中大量的数据进行整理,此时如果使用手动整理会非常繁琐而且容易出错.而如果采用VBA语言,在Excel中根据需求编写一段简单的代码就能自动完成大量数据的整理工作. 1.以Excel 2007为例,如果要进行VBA编程,需要启用"开发工具" 选项.在Excel 选项对话框中勾选[在功能区显示"开发工具"选项卡]复选框. 在开发工具选项中点击"查看代码",打开Microsoft Visual Basic界面. 2.在M

c语言const关键字

作者:沉默羔羊 c语言const关键字: --  特点. 使用该关键修饰的变量不能被改变.      --指针常量. demo:   const char *p或者是 char const * p --常量指针. demo: char * const p      --常量指针和指针常量. 1.常量指针指的是如 char * const p, p是一个常量,p不能改变指向. 2.指针常量指的是如char const *p,   p指向一个字符常量,p可以改变指向.但是不能改变*p. --对于常量

muParser公式库使用简介( 转)

muParser是一个跨平台的公式解析库,它可以自定义多参数函数,自定义常量.变量及一元前缀.后缀操作符,二元操作符等,它将公式编译成字节码,所以计算起来非常快. 当前版本V1.28,官方网址http://sourceforge.net/projects/muparser/,这里是关于该库使用交流https://sourceforge.net/forum/forum.php?forum_id=462843 它提供两种方式使用,一种是将它编译进你的程序中,使用C++类,另一种是将它编译成共享库,可

java 中的流程控制

Java程序通过控制语句来控制方法的执行流程从而实现特定的功能 Java中的流程控制结构主要有三种 顺序结构 选择结构 循环结构. 三种结构的结合使用可以解决任何复杂问题. 分支语句又称条件语句 条件语句使部分程序可根据某些表达式的值被有选择地执行. Java编程语言支持双路 if和多路 switch 分支语句. If-else语句 在 Java编程语言中if ()用的是一个布尔表达式而不是数字值. 形式如下 if(Boolean类型表达式1){ 语句1; } 以下的代码可以根据实际情况进行编写

MySQL中Index Merge简介

索引合并优化 官网翻译 MySQL5.7文档 索引合并是为了减少几个范围(type中的range类型:range can be used when a key column is compared to a constant using any of the =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, or IN() operators:)扫描的行数,并将他们的结果合并成一个.这里的合并可能是, 他们的并集.交集或