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总结
- 我们应当尽可能的使用const,减少#define的使用
- 任何不会修改数据的成员函数都应该声明为const 类型:void fun() const;
- 函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载
相关文章:
const详解
文章目录 简介什么是const呢?const 的使用1.用来定义常量2.和指针相关的const3.函数与const4.类中使用const(重点) c中去掉const属性验证不同对象的调用const修饰类内成员 c中的const 和 c中的const 的区别c中的const为什么c中的const常量又不能通过指针修改呢 const 和 #defi…...
多方面浅谈互联网技术
目录 方向一:物联网技术概述 方向二:物联网技术的应用 方向三:物联网发展所需技术和创新挑战 物联网技术(Internet of Things,IoT)是一种将各种智能设备、传感器、电子产品等连接起来,通过互…...
Oracle EBS GL 外币折算逻辑
背景 由于公司财务在10月份期间某汇率维护错误,导致帐套折算以后并合传送至合并帐套生成合并日记帐凭证的借贷金额特别大,但是财务核对的科目余额有没有问题,始终觉得合并日记帐生成会计分发有问题,需要我们给出外币折算逻辑。 基础设置 汇率 Path: GL->设置->币种-&…...
Java面试题之mysql
Mysql 1. MySQL的索引原理是什么?什么是索引?以及索引的优缺点?2. 解释一下B树和B树的区别及各自定义?3. MyISAM索引和Innodb索引的区别?4. 什么是聚簇索引?辅助索引?5.非聚簇索引一定会回表查询么?6. 什…...
抖音直播封禁申诉话术怎么讲?抖音直播封号怎么申请解封?
一.抖音直播封禁申诉话术怎么讲? 1. 了解封禁原因:首先,您需要清楚自己为何被封禁。抖音通常会在封禁时给出原因,如违规内容、恶意行为等。了解原因有助于您针对性地构建申诉话术。 2. 表达诚挚歉意:在申诉话术中,首…...
使用Jenkins部署前端Vue项目和后端Java服务
Jenkins安装相关插件,供后续使用(Dashboard - Manage Jenkins - Plugins) Maven Integration plugin https://plugins.jenkins.io/maven-plugin CloudBees Docker Build and Publish pluginhttps://plugins.jenkins.io/docker-build-publish…...
刷题——显示屏
目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 解 题目描述 液晶屏上,每个阿拉伯数字都是可以显示成 35 的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过 100100)和一串数…...
WEB服务器-Tomcat(黑马学习笔记)
简介 服务器概述 服务器硬件 ● 指的也是计算机,只不过服务器要比我们日常使用的计算机大很多。 服务器,也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障…...
第五节:Vben Admin权限-前端控制方式
系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、Vben Admin权…...
蓝桥杯备赛第二篇(背包问题)
1. 01 背包(采用状态压缩) 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子句中的操作符介绍,案例展示,索引失效的大坑就在这里
查询数据-过滤数据 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&#…...
vue项目打包获取git commit信息并输出到打包后的指定文件夹中
需求背景: 前端项目经常打包,发包部署,为了方便测试及运维发现问题时与正确commit信息对比 实现方式: 使用Node.js的child_process模块来执行git命令 实现步骤: 1.在package.json的同级目录下新建一个version.js文件。…...
vue 移动端app预览和保存pdf踩坑
需求 使用Vue开发h5,嵌套到Android和IOS的Webview里,需要实现pdf预览和保存功能,预览pdf的功能,我这边使用了三个库,pdf5,pdf.js,vue.pdf,现在把这三个库在app端的坑分享一下。先说…...
Vueuse:打造高效的 Vue.js 开发利器
Vueuse:打造高效的 Vue.js 开发利器 Vueuse 是一个功能强大的 Vue.js 生态系统工具库,它提供了一系列的可重用的 Vue 组件和函数,帮助开发者更轻松地构建复杂的应用程序。本文将介绍 Vueuse 的主要特点和用法,以及它在 Vue.js 开发…...
mysql锁的创建方式
在 MySQL 中,锁是用来控制多个用户对同一数据的访问。主要有两种类型的锁:表级锁和行级锁。MySQL 的锁定机制主要是通过 SQL 语句来实现的,而不是通过特定的锁定命令。下面是一些常见的锁相关的 SQL 操作方式:表级锁 MySQL 中,表级锁是最基本的锁策略,它会锁定整个表。一…...
5.WEB渗透测试-前置基础知识-常用的dos命令
内容参考于: 易锦网校会员专享课 上一篇内容:4.WEB渗透测试-前置基础知识-快速搭建渗透环境(下)-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 ,是一个…...
解决:code ERESOLVE:ERESOLVE could not resolve 的报错问题
报错实例 报错原因 是我执行npm i xxx-xx的时候会出现这个错误 查了资料表示是node.js的问题 或者的依赖本身的问题 解决 1.在后面加上 --legacy-peer-deps 示例:npm i sass-loader7.3.1 --legacy-peer-deps 2,检查node版本,更改node版本 …...
Dockerfile(3) - WORKDIR 指令详解
WORKDIR 切换到镜像中的指定路径,设置工作目录在 WORKDIR 中需要使用绝对路径,如果镜像中对应的路径不存在,会自动创建此目录一般用 WORKDIR 来替代 切换目录进行操作的指令 RUN cd <path> && <do something> WORKDIR…...
2024万元投影仪怎么选?极米RS10 Ultra和当贝X5 Ultra实测横评
随着过去一年投影仪的不断进步,高端型号在2024年初的选择变得更加多样。除了激光外混光已然成为“金字塔顶端”的一种全新光源选择。目前主流的就是作为Dual Light 2.0新升级的极米RS10 Ultra,以及ALPD5.0超级全色激光代表当贝X5 Ultra。很多人也肯定想知…...
java环境搭建
要搭建 Java 环境,你需要进行以下步骤: 1. 下载和安装 JDK(Java Development Kit):访问 Oracle 官方网站(https://www.oracle.com/java/technologies/javase-jdk14-downloads.html),…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
