当前位置: 首页 > 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;…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...