当前位置: 首页 > news >正文

const详解

文章目录

  • 简介
  • 什么是const呢?
  • const 的使用
    • 1.用来定义常量
    • 2.和指针相关的const
    • 3.函数与const
    • 4.类中使用const(重点)
  • c++中去掉const属性
    • 验证不同对象的调用
    • const修饰类内成员
  • c++中的const 和 c中的const 的区别
    • c中的const
    • 为什么c++中的const常量又不能通过指针修改呢
  • const 和 #define
  • const总结

简介

最近在阅读<Effective C++>这本书,阅读到条款三:尽可能的使用cosnt发现有好多遗忘的点,故写一篇文章来总结有关C++的 cosnt

什么是const呢?

const关键字用于定义一个常量,表示该对象是不能被修改的,是只读变量。

const 的使用

1.用来定义常量

  • 在定义的时候需要进行初始化
const int x = 1; // x用const修饰后只读
x = 2; //error

2.和指针相关的const

  • 指针所指向的内容不可以修改,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量
const char c  = 'x';
char const *p   = &c; //这里表示c是不可以修改的
const char* p = &c; //这里表示c是不可以修改的
  • 指针本身不可以修改,如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量
char a = 'y';
char c = 'x';
char*  const p = &c; //这里表示p是不可以修改的
p = &y ; //error 
*p = 1 ; //可以的

3.函数与const

  • const修饰函数返回值
const int* f(); //int* 所指向的内容是不可以修改
int * const f(); //指针本身不可以修改
  • const修饰函数的参数
//这里是值传递,产生的临时指针指向的内容不可以修改
void f(const int*  a) 
//引用的内容不可以修改
void f(const int& a)

4.类中使用const(重点)

  • const成员函数,在函数访问方面,只能访问const函数,不能访问非const函数

  • const成员函数,在变量访问方面,可以访问const和非const变量;

  • 非const成员函数,可以访问const和非const的成员函数和变量;

  • const 对象只能操作const成员函数,不能操作非成员函数;

  • const对象可以访问const和非const变量

c++中去掉const属性

用const_cast<new_type>(expression)

new_type是转化之后的类型 expression是被转化的表达式

在这里插入图片描述

验证不同对象的调用

#include<iostream>
#include<vector>
using namespace std;class test
{
public:void f1();void f2()const;
};int main()
{test t1;const test t2;//t1都能调用成功//非const对象能调用const和非const成员函数t1.f2();t1.f2();t2.f1(); //const对象调用非const成员函数错误const_cast<test&>(t2).f1(); //把const属性去掉t2.f2();
}

const修饰类内成员

  • const成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const成员的值可以不同。所以不能在类声明中初始化const成员,因为类的对象未被创建时,编译器不知道const 成员的值是什么
  • const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的enum常量来实现(enum back)。
class test
{	const int x = 100; //这是错误的
};class test1
{	enum { x = 10 }; //enum back
}

c++中的const 和 c中的const 的区别

c中的const

#include <stdio.h>int main()
{const int a = 1;int *p = (int *)&a; printf("1: %d\n", a); //1*p = 10;printf("2: %d\n", a); //10 可以发现a被修改成10了
}

为什么用指针能修改const常量的值呢?

其实const修饰的局部变量是在栈上分配空间,所以可以用指针修改该空间的值而修改该const局部变量的值

为什么c++中的const常量又不能通过指针修改呢

定义时,变量并不开辟内存空间,不会存储在内存中,而是开辟一张表,以key-value的形式存储,当const变量进行普通使用的时候,直接去表里面进行查表,拷贝过来用,当有取地址操作(&包含引用)或者extern操作(跨cpp文件使用)的时候,会开辟一片内存空间,从表中将值复制过来,存储在该内存空间,所以无论普通使用,还是通过取地址等操作,值都没有变,都来源那个表

const 和 #define

const和define都能作为常量来使用

区别

  • const有作用域的概念,函数内部定义的const变量只能在函数内部使用;而define没有作用域的概念(除非使用ifdef配合)一个函数内定义的宏定义变量可以在另外一个函数中使用
  • const变量的处理时机是编译器,所以会有作用域等检查,define是由预处理器处理,是单纯的文本替换
  • define不能用来定义class专属常量,没有任何封装性

const总结

  1. 我们应当尽可能的使用const,减少#define的使用
  2. 任何不会修改数据的成员函数都应该声明为const 类型:void fun() const;
  3. 函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载

相关文章:

const详解

文章目录 简介什么是const呢?const 的使用1.用来定义常量2.和指针相关的const3.函数与const4.类中使用const(重点) c中去掉const属性验证不同对象的调用const修饰类内成员 c中的const 和 c中的const 的区别c中的const为什么c中的const常量又不能通过指针修改呢 const 和 #defi…...

多方面浅谈互联网技术

目录 方向一&#xff1a;物联网技术概述 方向二&#xff1a;物联网技术的应用 方向三&#xff1a;物联网发展所需技术和创新挑战 物联网技术&#xff08;Internet of Things&#xff0c;IoT&#xff09;是一种将各种智能设备、传感器、电子产品等连接起来&#xff0c;通过互…...

Oracle EBS GL 外币折算逻辑

背景 由于公司财务在10月份期间某汇率维护错误,导致帐套折算以后并合传送至合并帐套生成合并日记帐凭证的借贷金额特别大,但是财务核对的科目余额有没有问题,始终觉得合并日记帐生成会计分发有问题,需要我们给出外币折算逻辑。 基础设置 汇率 Path: GL->设置->币种-&…...

Java面试题之mysql

Mysql 1. MySQL的索引原理是什么?什么是索引&#xff1f;以及索引的优缺点&#xff1f;2. 解释一下B树和B树的区别及各自定义?3. MyISAM索引和Innodb索引的区别&#xff1f;4. 什么是聚簇索引&#xff1f;辅助索引&#xff1f;5.非聚簇索引一定会回表查询么&#xff1f;6. 什…...

抖音直播封禁申诉话术怎么讲?抖音直播封号怎么申请解封?

一.抖音直播封禁申诉话术怎么讲? 1. 了解封禁原因&#xff1a;首先&#xff0c;您需要清楚自己为何被封禁。抖音通常会在封禁时给出原因&#xff0c;如违规内容、恶意行为等。了解原因有助于您针对性地构建申诉话术。 2. 表达诚挚歉意&#xff1a;在申诉话术中&#xff0c;首…...

使用Jenkins部署前端Vue项目和后端Java服务

Jenkins安装相关插件&#xff0c;供后续使用&#xff08;Dashboard - Manage Jenkins - Plugins&#xff09; Maven Integration plugin https://plugins.jenkins.io/maven-plugin CloudBees Docker Build and Publish pluginhttps://plugins.jenkins.io/docker-build-publish…...

刷题——显示屏

目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 解 题目描述 液晶屏上&#xff0c;每个阿拉伯数字都是可以显示成 35 的点阵的&#xff08;其中 X 表示亮点&#xff0c;. 表示暗点&#xff09;。现在给出数字位数&#xff08;不超过 100100&#xff09;和一串数…...

WEB服务器-Tomcat(黑马学习笔记)

简介 服务器概述 服务器硬件 ● 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说服务器应具备承担服务并且保障…...

第五节:Vben Admin权限-前端控制方式

系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、Vben Admin权…...

蓝桥杯备赛第二篇(背包问题)

1. 01 背包&#xff08;采用状态压缩&#xff09; public static void main(String[] args) {Scanner scanner new Scanner(System.in);int M scanner.nextInt();int N scanner.nextInt();int[] value new int[N 1];int[] weight new int[N 1];int[] dp new int[M 1];…...

【postgresql 基础入门】带过滤条件的查询,where子句中的操作符介绍,案例展示,索引失效的大坑就在这里

查询数据-过滤数据 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#…...

vue项目打包获取git commit信息并输出到打包后的指定文件夹中

需求背景&#xff1a; 前端项目经常打包&#xff0c;发包部署&#xff0c;为了方便测试及运维发现问题时与正确commit信息对比 实现方式&#xff1a; 使用Node.js的child_process模块来执行git命令 实现步骤&#xff1a; 1.在package.json的同级目录下新建一个version.js文件。…...

vue 移动端app预览和保存pdf踩坑

需求 使用Vue开发h5&#xff0c;嵌套到Android和IOS的Webview里&#xff0c;需要实现pdf预览和保存功能&#xff0c;预览pdf的功能&#xff0c;我这边使用了三个库&#xff0c;pdf5&#xff0c;pdf.js&#xff0c;vue.pdf&#xff0c;现在把这三个库在app端的坑分享一下。先说…...

Vueuse:打造高效的 Vue.js 开发利器

Vueuse&#xff1a;打造高效的 Vue.js 开发利器 Vueuse 是一个功能强大的 Vue.js 生态系统工具库&#xff0c;它提供了一系列的可重用的 Vue 组件和函数&#xff0c;帮助开发者更轻松地构建复杂的应用程序。本文将介绍 Vueuse 的主要特点和用法&#xff0c;以及它在 Vue.js 开发…...

mysql锁的创建方式

在 MySQL 中,锁是用来控制多个用户对同一数据的访问。主要有两种类型的锁:表级锁和行级锁。MySQL 的锁定机制主要是通过 SQL 语句来实现的,而不是通过特定的锁定命令。下面是一些常见的锁相关的 SQL 操作方式:表级锁 MySQL 中,表级锁是最基本的锁策略,它会锁定整个表。一…...

5.WEB渗透测试-前置基础知识-常用的dos命令

内容参考于&#xff1a; 易锦网校会员专享课 上一篇内容&#xff1a;4.WEB渗透测试-前置基础知识-快速搭建渗透环境&#xff08;下&#xff09;-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 &#xff0c;是一个…...

解决:code ERESOLVE:ERESOLVE could not resolve 的报错问题

报错实例 报错原因 是我执行npm i xxx-xx的时候会出现这个错误 查了资料表示是node.js的问题 或者的依赖本身的问题 解决 1.在后面加上 --legacy-peer-deps 示例&#xff1a;npm i sass-loader7.3.1 --legacy-peer-deps 2&#xff0c;检查node版本&#xff0c;更改node版本 …...

Dockerfile(3) - WORKDIR 指令详解

WORKDIR 切换到镜像中的指定路径&#xff0c;设置工作目录在 WORKDIR 中需要使用绝对路径&#xff0c;如果镜像中对应的路径不存在&#xff0c;会自动创建此目录一般用 WORKDIR 来替代 切换目录进行操作的指令 RUN cd <path> && <do something> WORKDIR…...

2024万元投影仪怎么选?极米RS10 Ultra和当贝X5 Ultra实测横评

随着过去一年投影仪的不断进步&#xff0c;高端型号在2024年初的选择变得更加多样。除了激光外混光已然成为“金字塔顶端”的一种全新光源选择。目前主流的就是作为Dual Light 2.0新升级的极米RS10 Ultra&#xff0c;以及ALPD5.0超级全色激光代表当贝X5 Ultra。很多人也肯定想知…...

java环境搭建

要搭建 Java 环境&#xff0c;你需要进行以下步骤&#xff1a; 1. 下载和安装 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;访问 Oracle 官方网站&#xff08;https://www.oracle.com/java/technologies/javase-jdk14-downloads.html&#xff09;&#xff0c;…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...

智警杯备赛--excel模块

数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中&#xff0c;点击确定 这是最终结果&#xff0c;但是由于环境启不了&#xff0c;这里用的是自己的excel&#xff0c;真实的环境中的excel根据实训…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)

文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button&#xff08;鼠标点击不放连续移动快捷键&#xff09; Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...