C++常量const建议收藏

常量折叠概念常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值,编译器

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

常量折叠概念

  常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值,编译器当然没有必要维护这个符号,而常量折叠发生的情况是,对常量的引用情况全部替换为该常量的值,但是,常量名并不会消失,编译器会把它放入到符号表中,同时会为该变量分配空间,栈空间或全局空间。

void const_test()
{
    int i0 = 11;  

    const int i=0;         //定义常量i  
    int *j = (int *) &i;   //看到这里能对i进行取值,判断i必然后自己的内存空间  
    *j=1;                  //对j指向的内存进行修改  
    printf("%d\n%d\n%d\n%d\n",&i,j,i,*j); //观看实验效果  
    const int ck = 9; //这个对照实验是为了观察,对常量ck的引用时,会产生的效果  
    int ik = ck;  

    int i1 = 5;           //这个对照实验是为了区别,对常量和变量的引用有什么区别  
    int i2 = i1;  
}

输出结果:

  0012ff7c

  0012ff7c

  0

  1

(1)ij地址相同,*j==1,而i的值却实实在在等于0

(2)printf(
“%d\n%d\n%d\n%d\n”,&i,j,i,*j) 别替换为printf(
“%d\n%d\n%d\n%d\n”,&i,j,0,*j) 
(3)对可折叠的常量的引用会被替换为该常量的值,而对变量的引用就需要访问变量的内存

const在集合中的错误使用

  const可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。在这种情况下,const意味着“不能改变的一块内存”。然而其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。

  const int i[] = {1,2,3,4,5};
   int a = i[3];
   float f[i[3]];  // illegal

  在一个数组定义里,编译器必须能产生这样的移动存储数组的栈指针代码,在上面的非法定义里,编译器给出的提示是因为它不能再数组定义里找到一个常量表达式。

const在C和C++中的区别

const int buffsize = 10;
char buff[buffsize];

  上面的代码在C++中可以,但在C中不行,因为buffsize占用存储的某个地方,所以C编译器不指定它在编译时的值

const int buffsize;

  上面的代码在C中可以,因为在C中默认const为外部链接,C++默认const为内部链接,所以再C++中要写成extern const int buffsize;

 类里const和enum

  在一个类里,const恢复它在C中的一部分意思,它在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能改变。在一个类里使用const的意思是“在这个对象寿命周期内,这是一个常量”。然而,对这个常量来讲,每个不同的对象可以含一个不同的值。所以不能像下面这么写:

class bob
{
    const int nSize = 100;
    int array[nSize];
};

  因为在类对象进行了存储空间分配,编译器不知道const的内容是什么,所以不能把它用作编译期间的常量。

  我们可以使用不带实例的无标记的enum

class bob
{
   enum {nSize = 100};
    
    int array[nSize];
};

使用enum是不会占用对象中的存储空间的,枚举常量在编译时被全部求值。枚举在类外面时,占用4个字节空间

  这样,在一个类里建立一个const时,不能给它初值。这个初始化工作必须发生在构造函数里,并且要在构造函数的某个特殊的地方。因为const必须在建立它的地方被初始化,所有在构造函数的主体里,const必须已经被初始化,否则就只有等待,直到在构造函数主体以后给它初始化,这样无法防止在构造函数主体的不同地方改变const的值。

class fred
{
private:
    const int nSize;
public:
    fred();
};

fred::fred():nSize(100){}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120177.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux 如何查看mysql版本,Linux系统下查看mysql版本的四种方法

    linux 如何查看mysql版本,Linux系统下查看mysql版本的四种方法1:在终端下:mysql-V。以下是代码片段:复制代码代码如下:[shengting@login~]$mysql-VmysqlVer14.7Distrib4.1.10a,forredhat-linux-gnu(i686)2:在mysql中:mysql>status;以下是代码片段:复制代码代码如下:mysql>status;————–m…

    2025年5月31日
    0
  • python+pycharm+anaconda_anaconda中的python

    python+pycharm+anaconda_anaconda中的python anaconda+pycharm(1)anaconda http://aperise.iteye.com/blog/2369537 anaconda+pycharm(2)pycharm anaconda+pycharm(3)Python网页抓取  anaconda+pycharm(4)Python机器学习库 Anacond…

    2022年8月26日
    3
  • word文件都变成了白色的图标了,该怎么处理?-ZOL问答_word图标变成白底docx

    word文件都变成了白色的图标了,该怎么处理?-ZOL问答_word图标变成白底docxwin10word图标变白了怎么办?在win10操作系统中当我们需要使用一些办公软件office,当我们在win10系统中安装了office之后,桌面上出现了excel、word以及PowerPoint等图标,这些图标上竟然都显示不正常,在图标上面有一个白色的图标,变白的现象该怎么办呢?针对这样的现象一般是缓存文件引起的,下面给大家介绍下win10word图标变成白底的解决方法。word图标…

    2022年10月19日
    0
  • linux中用户态和内核态是什么_用户态内核

    linux中用户态和内核态是什么_用户态内核内核态:操作系统在内核态运行——运行操作系统程序用户态:应用程序只能在用户态运行——运行用户程序当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。…

    2022年9月17日
    0
  • nginx正向代理(超简单)

    正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。环境192.168.153.179:正向代理192.168.153.178:客户端CentOSLinuxrelease7.5.1804(Core)关闭防火墙和selinux开始部署:首先,两台服务器安装nginx源码安装:1、安装启动安装依赖yum-yinstallwgetgcc

    2022年4月5日
    32
  • 矩阵可逆的充要条件证明_两个矩阵相乘所得矩阵的秩

    矩阵可逆的充要条件证明_两个矩阵相乘所得矩阵的秩矩阵可逆的充要条件有很多,在此进行总结。设A为n阶矩阵,则矩阵A可逆的充要条件为:|A|≠0;r(A)=n;A的列(行)向量组线性无关;A的特征值中没有0;A可分解为若干初等矩阵的乘积.

    2022年8月5日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号