简介

1. 易忽略的常量:函数地址(函数名)、静态数组的名字、字符串常量的地址。

2. 常量分类:字面常量、符号常量、契约性常量、布尔常量、枚举常量。


常量认知

1. 字面常量

包括:各种进制的数字、字符、字符串。

存储位置:程序的符号表中,非数据区。只能引用不能修改。只允许获取字符串的地址。

 x=-100.25f;
char c='a';
const char *pchar = "abcd";
int *pInt = NULL;

2. 符号常量

包括:#define 定义的宏常量、const定义的常量。

#define

//const常量存储方式

1. #define 定义的宏常量在进入编译阶段之前就已经被替换为字面常量,宏常量的本质就是字面常量。

const

//const常量存储方式

1. C中,const常量为值不能修改的变量,分配存储空间。

2. C++中,基本数据类型的const常量放置在符号表中,

ADT数据类型、强制extern的const常量分配存储空间。

     //有用的实践

3. 取const常量的地址:

基本数据类型const常量:编译器在内存中创建一个拷贝,实际访问的是拷贝地址,非原始地址,无法通过指针修改基本类型const常量。

    构造数据类型const常量:可以通过获取常量指针,绕过编译器修改const常量。

结论:只要得到对象的指针(内存地址),就可以越过编译器修改其内容,除非受到操作系统保护。

 3. 使用符号常量替代字面常量

why:

a.提高程序可读性。

b.方便多处的相同数字或字符串修改。

c.避免多次输入同样的数字或字符串引入错误。

4. 类中的常量

作用:

将常量与类关联在一起,使其只在类中生效。

方式:

a.单个对象中的常量

类中声明的const常量:

//只是对象声明周期内的常量

//不同对象的const常量可不同

 class A
{
A(int size)
const int SIZE; //常量声明
const int size= 错误的用法
}; A::A(int size):SIZE(size) //利用构造函数初始化列表初始化常量
{
} A a(); //SIZE==100
A b(); //SIZE==200

b.整个类内的常量:所有对象共享的常量

enum常量:

enum常量不占据对象的内存空间

 class A
{
enum
{
SIZE1=;
SIZE2=;
};
int array1[SIZE1];
};

static const 常量:

 class A
{
static const int SIZE=;//某些编译器不支持该用法 int array[SIZE];
};

C++/C常量的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. JavaScript 常量定义

    相信同学们在看见这个标题的时候就一脸懵逼了,什么?JS能常量定义?别逗我好吗?确切的说,JS当中确实没有常量(ES6中好像有了常量定义的关键字),但是深入一下我们可以发现JS很多不为人知的性质,好好利 ...

  3. ES6之变量常量字符串数值

    ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...

  4. Java常量的应用

    所谓常量,我们可以理解为是一种特殊的变量,它的值被设定后,在程序运行过程中不允许改变. 语法:final 常量名 = 值; 使用fianl关键字 常量名 值 final String a1 = &qu ...

  5. 原创 C++之常量(二)

    4常量的内存分配 4.1应用程序的内存结构 一个由C++编译的应用程序,占用的内存可以划分为如下几个部分: 栈(stack).由编译器自动分配释放.存放函数参数和函数里的局部变量(又称自动变量).其操 ...

  6. 原创 C++之常量(一)

    1概述 一个C++程序就是一系列数据与操作的集合.当一个C++程序开始运行的时候,与该程序相关的数据就会被加载到内存中.当数据与内存发生关联的时候,这些数据就会具有如下的特性: 数据在内存中的地址.这 ...

  7. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  8. swift 简介和常量与变量 --- swift 入门

    一.思维导图 二. 代码 //创建UIView 和按钮 let views = UIView(frame: CGRect(x:20, y: 20, width: 100, height: 100))/ ...

  9. java为什么非静态内部类中不能有static修饰的属性,但却可以有常量?

    如:public class InnerClassDemo{int x;class A{static int a = 0;//这样写是不合法的.static final int b=0;//这样写是合 ...

  10. String字符串针对常量池的优化

    String对象是java语言中重要的数据类型,但是不是基本数据类型.相对于c语言的char java做了一些封装和延伸. 针对常量池的优化:当两个String拥有相同的值时,它们只引用常量池中的同一 ...

随机推荐

  1. Long类型比较大小,long型和Long型区别

    今天写代码发现发现本地程序是正常的,但是发送到测试环境就不正常了,本着对数据的怀疑态度链接了测试数据库,调试程序发现,确实是数据问题,然后数据出现在什么地方呢?才发现是在判断用户所属的teamGrou ...

  2. AxonVR:体验有触觉有温度的VR世界

    提到VR,通常指的是 Oculus Rift 及 HTC Vive的头盔:它们以视觉及听觉使你感到身处虚拟世界.头盔成功的在视觉及听觉感官上蒙骗了你,但我们体验现实的感官不仅于此.绝大多数的VR产品忽 ...

  3. 必须掌握的Linux命令

    章节简述: 本章节讲述系统内核.Bash解释器的关系与作用,教给读者如何正确的执行Linux命令以及常见排错方法. 经验丰富的运维人员可以恰当的组合命令与参数,使Linux字符命令更加的灵活且相对减少 ...

  4. find中的-print0和xargs中-0的区别

    默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: [bash-4.1.5] ; ls -l total 0 -r ...

  5. 两种画线算法(DDA&Bersenham)

    DDA(digital differential analyzer) 由直线的斜截式方程引入 对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值 Yk+1 = ...

  6. Abstraction elimination

    (本文不保证不误人子弟,切勿轻信) Unlambda指的是lambda计算中去掉lambda操作(does not have lambda(or abstraction) operation of t ...

  7. CentOS7中将Mysql添加为系统服务

    如果是自己通过tar包安装的Mysql,不会自动添加到系统服务中,可通过如下方式,自己添加. 先启动一下mysql ${mysql}/support-files/mysql.server start ...

  8. [SOJ] 商人的宣传

    Description Bruce是K国的商人,他在A州成立了自己的公司,这次他的公司生产出了一批性能很好的产品,准备宣传活动开始后的第L天到达B州进行新品拍卖,期间Bruce打算将产品拿到各个州去做 ...

  9. 面试题-Java基础-开发环境

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设 ...

  10. how to check if you have TURNIN successfully?

    For example, if I want to check if I have turnin my proj1 of cs130a successfully, I just use this co ...