简单聊一下const
问题索引:
1.为什么要存在这种东西?
2.它有什么样的作用?
3.与define 有什么联系?
4.C与C++中的const有什么区别?
5. C++ 11 中又有了些什么新的东西?
解:
1.为什么要存在这种东西?就是为了避免程序员在编程时,手残修改关键部分的值(其实想一想内核为什么会分内核态和用户态,类中为什么要有public和private也就明白了)
2.它有什么样的作用?其实说的简单点就是保护被修饰的东西,防止意外的修改
3.与define 有什么联系?他们的底层实现是如何的?其实这是一个最不好回答的问题。我就简单的从内存方面来叙述一下
联系:
define – 不分配内存,给出的是立即数,只是简单的替换。有多少次使用就进行多少次拷贝替换,在内存中会有多个拷贝,消耗内存大
const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝
更多的戳这里和那里:这里
那里
4.C与C++中的const有什么区别?
C中的const
1.C中的const修饰的是只读变量,还是变量,只是不可写
2.有两种改变变量的值:(1)直接赋值的形式(2)通过指针
const m= 10; //m 的值不能在程序中被修改(但可以通过指针改变它)
const char *p; //*p不能变,即通过指针无法改变变量的值
char const *p; //同上,只是形式不同而已
char *const p; //p不能变,即**指针p的指向**被固定,也就是说,指针这个变量只能存储指向变量的值。
const char *const p; //*p 和p同时不能变
举例验证:
1.代码:
#include<stdio.h>
int main(void)
{/*const 19; //修饰了常量*/const int m = 10;
// m= 11; //1.c:13:6: 错误:向只读变量‘m’赋值int *p_m = &m ; //1.c:14:16: 警告:initialization discards ‘const’ qualifier from pointer target type*p_m = 999999;printf("m == %d \n",m); //通过指针就可以改变它的值return 0;
}
2.代码:
#include<stdio.h>
int main(void)
{/*int m= 10;const int *p ;p=&m;
// *p= 1111; //1.c:14:7: 错误:向只读位置‘*p’赋值m= 22222; //直接赋值的形式可以改变它的值printf("const int *p的情况: m == %d \n",m);*/int n = 50;int temp = 0;int *const p=&n ;p=&temp ; //1.c:26:6: 错误:向只读变量‘p’赋值 return 0;
}
注意只读变量‘p’与只读位置‘*p’ 的差别!!!!
记法:左定值,右定向。
解释:const 在(变量)的左边,即:const int *p .就不能通过(*变量)来改变它的值。const 在(变量)的右边,即: int *const p .就不能改变指针的指向。**
C++中的const
1. const对象必须初始化 ,比如:const int k ;就是错误的
2.默认状态下,const对象仅在本文件内有效。如果要在其他文件中也要使用该对象,需要使用extern来声明
3.常量引用(不是一个对象):C++一般不允许改变引用所绑定的对象(其实引用就是给这个对象起了一个新名字,其实就是一个硬链接)但是绑定的这个对象是不是const型就没有什么太大的关系了,如果是const,那就它所参与的运算不能改变它的值,如果不是,那就可以改变它的值。但是引用与对象之间的关系又不会被改变~_~
4.指针是一个对象,它又可以指向另一个对象,那么指针可以是常量,指针指向的对象也可以是常量。顶层const就是指针本身是一个常量,底层const表示指针指向的对象是一个常量。
链接学习:这里写链接内容
这里写链接内容
5.C++ 11 中又有了些什么新的东西?
1.常量表达式:值不会改变,在编译过程中就能得出结果的表达式
2.constexpr :规定该类型就可以告诉编译器去验证变量的值是不是一个常量表达式。声明为该类型的变量一定时一个常量,必须用常量表达式来初始化。
初学者,先学完,再回头,找细节!
转载于:https://www.cnblogs.com/Tattoo-Welkin/p/10335321.html
简单聊一下const相关推荐
- 简单聊一下Android音频通路的切换
Android支持多种设备的的输出.一台正常的机子,本身就自带话筒,扬声器,麦克风等多个声音输入输出设备,再加上五花八门的外置设备(通过耳机,蓝牙,wifi等方式连接),使声音的输出更具多样性.And ...
- 面试 - 要不简单聊一下你对MySQL索引的理解?
转载自 面试 - 要不简单聊一下你对MySQL索引的理解? MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来. 一.索引是什么? 索引是帮助MySQL高效获取数据的 ...
- GAN(生成对抗网络)和IQA(图像质量评价能擦出什么样的火花呢?)简单聊一些近来published的论文
在图像质量评价领域奋斗了三年,感觉实在不容易.现在的目标是做一些相当开创性的工作,而不是刻意是follow别人的工作,当然,这很难,至今还没有实现,希望我能圆梦. 之前自己的博客有写过关于手工特征和深 ...
- 工作篇 之 简单聊下有关环信的 “坑” ...
LZ-Says:相遇,相知,相恋,争执,平淡,压抑,愤懑,该画上句号了. 前言 环信,Enmmm,牛逼,懵 ing -! 最近这段时间一直围绕环信,在使用的过程中,遇到很多很多问题,自己都感觉蒙圈,烦 ...
- 简单聊下中台概念与发展
什么是中台 中台可以视作是支持多个前台业务中具有公共业务属性的能力组织. 所以他有组织+系统两个层面的事情.需要有个自运营的组织,对外提供的是抽象的服务. 钟华老师说:中台是将企业核心能力以服务化形式 ...
- 简单聊一下makefile中的 =, :=, ?=和+=
最容易混淆的是 =和:=, 我们先来看看makefile: [plain] view plaincopy x = hello y = $(x) x = world test1: test1.cpp @ ...
- go+mysql+redis+vue3简单聊室,第1弹:接口路由搭建和传参
文章目录 创建基本路由 接收和验证数据 该项目为练手项目,只实现了简单聊天室功能,主要目的为了熟悉golang的协程,go中使用mysql和redis,同时学习vue3和element-plus,项目 ...
- 简单聊下STM32F103的时钟
对于芯片而言,电源和时钟是缺一不可的. 电源为芯片提供能量,时钟则提供时间基准,芯片好按照这个tick依次执行指令. STM32F103是一款性价比很好的芯片,它的时钟树长这样: 它有4个时钟源,不同 ...
- 简单聊下STM32F103的串口
串口是单片机嵌入式必不可少的外设,它上手简单,使用方便,很受小伙伴的欢迎. 用STM32CubeMX体验下STM32F103的串口,硬件平台采用百问网STM32F103mini开发板. 生成的一些代码 ...
- 简单聊下STM32F103的GPIO
GPIO是芯片和外界沟通的桥梁,GPIO有很多模式,不同的模式有不同的配置,应用于不同的场合. STM32F103系列的I/O引脚共有8种工作模式, 输入模式有四种 浮空输入 上拉输入 下拉输入 模拟 ...
最新文章
- clear session on close of browser jsp
- Python数据分析之pandas入门
- Android 小項目之---Iphone拖动图片特效 (附源码)
- 【计算机网络】周知端口号列表
- php截取多个分割符号_PHP按符号截取字符串的指定部分的实现方法
- 职教云python程序设计答案_智慧职教云课堂Python程序设计(常州工业职业技术学院)答案公众号...
- 面向公交营运管理的车路协同应用场景研究
- 设为首页加入收藏代码_兼容各浏览器ie系列Firefox
- 金蝶k3 使用两台服务器的优势,金蝶k3报价系统优势如何,电商企业应用尤为明显...
- Hive Hsql 常用命令
- java jre 1.8_jre1.8官方下载
- 最优秀的数据可视化案例欣赏
- IPv4 至 IPv6改造过渡方案
- 双专线接入H3C防火墙无法远程到设备
- Unity手游制作记-制作通用镜头控制器
- 多传感器融合方式分析
- 合利宝实际控制人即将易主:海科金集团接盘仁东控股
- 什么是buffer?
- Play 2.6 在Play中使用缓存
- 使用 IBM Bluemix 容器构建 Django 环境