【008】C++数据类型之重要关键字详解

news2024/11/23 6:26:29

C++数据类型之重要关键字详解

  • 引言
  • 一、const修饰普通变量
    • 重点说明
  • 二、register修饰寄存器变量
  • 三、volatile强制访问内存
  • 四、sizeof测试类型的大小
  • 五、typedef关键字
  • 总结

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【007】

一、const修饰普通变量

C++中,const关键字修饰普通变量表示该变量的值是不可修改的,即它是一个常量。常量必须在定义时进行初始化,之后就不能再改变其值。

例如:

const int a = 10;
a = 20; // 编译错误,a是一个常量,值不可修改。

在函数参数中,使用const可以防止函数改变传入的参数的值。

例如:

void printValue(const int value) {
  // value += 1; // 编译错误,value是一个常量,值不可修改。
  cout << "The value is: " << value << endl;
}

注意,在C++中,使用const修饰一个变量并不意味着它一定会被存储在只读内存中。编译器仍然有可能将其放在可写内存中,只是在代码中访问该变量时会禁止修改它的值。因此,如果需要确保变量的值不被修改,应该使用更加严格的措施,如C++11中的constexpr或C++17中的std::string_view等。

重点说明

(1)如果是以常量初始化const修饰的变量,那么只读变量的值事先存放在 “符号常量表”,不会立即开辟空间。只有当对其取地址时,系统才会为其开辟空间。

示例:

#include <iostream>

using namespace std;

int main()
{
	const int data = 100;
	int *p = (int *)&data;
	*p = 2000;
	cout << "data = "<<data << endl;
	cout << "*p = " << *p << endl;
	
	return 0;
}

输出:

data = 100
*p = 2000

在这里插入图片描述
(2)如果以变量初始化const修饰的只读变量,那么只读变量会立即开辟空间,此时就没有符号常量表。
示例:

#include <iostream>

using namespace std;

int main()
{
	int a=10;
	const int data = a;
	int *p = (int *)&data;
	*p = 2000;
	cout << "data = "<<data << endl;
	cout << "*p = " << *p << endl;
	
	return 0;
}

输出:

data = 2000
*p = 2000

(3)const修饰自定义类型变量,立即开辟空间,此时也没有符号常量表。

二、register修饰寄存器变量

我们都知道,CPU访问寄存器的速度比内存快到多。
在这里插入图片描述
如果变量被高频使用,系统会自动将变量存储在寄存器中,目的是提高访问效率。

如果用户想将变量直接放在寄存器中,可以使用register修饰。例如:

register int data=0;

注意,尽量不要对寄存器变量取地址,因为寄存器是没有地址的。register修饰的变量只是尽量将变量放入寄存器,而不是一定能够放入寄存器中,因为寄存器是很珍贵的。

三、volatile强制访问内存

强制访问内存,防止编译器优化。使对变量的访问必须每次都从内存上取。

volatile int data=0;

在这里插入图片描述

四、sizeof测试类型的大小

C++的sizeof关键字用于测试类型、变量或表达式占用的存储空间大小,其语法为:

sizeof (类型/变量/表达式)

其中,类型可以是任意C++数据类型,变量和表达式必须是已经定义或声明过的。

对于不同的类型,sizeof返回的值也会不同。下面是一些常见类型的sizeof值示例:

sizeof(char)      // 1
sizeof(short)     // 2
sizeof(int)       // 4
sizeof(long)      // 32位平台是4字节,64位平台是8字节
sizeof(float)     // 4
sizeof(double)    // 8
sizeof(bool)      // 1
sizeof(pointer)   // 4 or 8 (depending on the system)

需要注意的是,sizeof返回的值以字节为单位。在不同的编译器和操作系统中,sizeof返回的值可能会略有差异。

五、typedef关键字

C++的typedef关键字是用来为已有类型定义一个新的别名,可以方便地使用这个别名来代替原有的类型名称。不会创建新的类型。

操作步骤:

  1. 先用已有的类型定义一个变量,例如:
int num;
  1. 用别名替换变量名,例如:
int INT32;
  1. 在整个表达式最前面加typedef,例如:
typedef int INT32;

示例:

typedef int myInt;
myInt x = 10; // 等价于 int x = 10;

另外,typedef也可以用来定义复杂类型的别名,如指针、数组、结构体等。

例如:

typedef int* IntPointer;
IntPointer p; // 等价于 int* p;

typedef int IntArray[5];
IntArray a = {1,2,3,4,5}; // 等价于 int a[5] = {1,2,3,4,5};

typedef struct {
    int age;
    char name[20];
} Person;
Person p1 = {18, "Tom"}; // 定义一个Person结构体

总结

C++中的一些重要关键字:

  1. auto:用于自动推断变量类型。

  2. const:用于定义常量,表示变量的值不可更改。

  3. static:用于静态变量和静态函数的声明。

  4. extern:用于声明在其他文件中定义的全局变量或函数。

  5. inline:用于行内函数的定义。

  6. friend:用于声明友元函数或友元类。

  7. virtual:用于定义虚函数,实现多态性。

  8. new/delete:用于动态分配和释放内存。

  9. try/catch/throw:用于异常处理。

  10. typedef:用于给已有类型定义一个别名。

  11. template:用于泛型编程和模板类的定义。

  12. namespace:用于命名空间的定义,避免命名冲突。

  13. explicit:用于构造函数声明,禁止隐式转换。

  14. mutable:用于类中成员变量的定义,表示该变量可以修改。

  15. operator:用于操作符重载。

  16. sizeof:用于返回数据类型或变量所占的字节数。

  17. typeid:用于获取对象的类型信息。

  18. volatile:用于声明易变变量,防止编译器进行优化。

  19. register:用于将变量存储在CPU寄存器中,提高访问速度。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建go web 框架

思想base部分day1:封装gee封装context上下文封装前缀tree路由树分组封装group与中间件封装文件解析封装封装错误处理测试 思想 web框架服务主要围绕着请求与响应来展开的 搭建一个web框架的核心思想 1 便捷添加响应路径与响应函数(base) 2 能够接收多种数据类型传入(上下文cont…

第二章 表操作

一、数据表的设计理念 数据表是包括数据库所有数据的数据库对象&#xff0c;数据在表中的组织方式与在电子表格中相似&#xff0c;都是按行和列的格式组织的&#xff0c;其中每一行代表一条唯一的记录&#xff0c;每一列代表记录中的字段&#xff0c;表中的数据库对象包含列、…

Godot4节点树右键菜单添加自定义选项

前言 查看godot的源码推荐使用在线版vscode直接从github上看。&#xff08;直接把网址的com改成dev即可&#xff09; 重点查看以下源码 scene_tree_dock.h scene_tree_dock.cpp 开始 tool extends EditorPluginvar window var scene_menustatic func find_child_by_class(no…

OneDrive同步角标消失 - 解决方案

问题 在电脑端使用OneDrive时&#xff0c;文件管理器OneDrive文件夹内的文件会在左下角显示同步状态&#xff0c;如下图。若没有显示同步角标&#xff0c;则此功能出现异常&#xff0c;下文介绍如何显示同步角标。 值得一提的是&#xff0c;同步角标只起到显示作用&#xff0…

secure CRT 颜色主题 系统间拷贝

文章目录 颜色主题如何切换 SecureCRT 颜色主题如何新建SecureCRT 颜色 主题如何拷贝我的颜色主题,主题名为pic VIM系统间拷贝vim中 ubuntu 拷贝 到 win1. 确保 ubuntu 上的 vim 支持 clipboard 特性2. 在 ~/.vim/vimrc 中添加设置3. vim中 win拷贝到ubuntu SecureCRT 关键字高…

STM32实现基于RS485的简单的Modbus协议

背景 我这里用STM32实现&#xff0c;其实可以搬移到其他MCU&#xff0c;之前有项目使用STM32实现Modbus协议 这个场景比较正常&#xff0c;很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集&#xff0c;我记得之前用过一些传感器都…

pg事务:隔离级别历史与SSI

事务隔离级别的历史 ANSI SQL-92定义的隔离级别和异常现象确实对数据库行业影响深远&#xff0c;甚至30年后的今天&#xff0c;绝大部分工程师对事务隔离级别的概念还停留在此&#xff0c;甚至很多真实的数据库隔离级别实现也停留在此。但后ANSI92时代对事物隔离有许多讨论甚至…

队列的实现(附含两道经典例题)

&#x1f349;文章主页&#xff1a;阿博历练记 &#x1f4d6;文章专栏&#xff1a;数据结构与算法 &#x1f68d;代码仓库&#xff1a;阿博编程日记 &#x1f365;欢迎关注&#xff1a;欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f33e;前言&#x1f3ac;队列&…

探索Windows CMD命令的经典应用:实用技巧大揭秘,值得收藏

文章目录 导语&#xff1a;第一部分&#xff1a;CMD命令基础1. ipconfig&#xff1a;获取网络配置信息2. ping&#xff1a;测试网络连接3. dir&#xff1a;查看目录内容4. telnet&#xff1a;远程登录和测试网络服务 第二部分&#xff1a;进程管理5. tasklist&#xff1a;查看正…

10-Docker发布微服务

文章目录 搭建SpringBoot项目发布微服务项目到Docker容器 搭建SpringBoot项目 搭建一个简单的SpringBoot项目&#xff1a; 创建maven工程&#xff0c;pom为&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

【Java多线程案例】单例模式

本期讲解单例模式的饿汉模式与懒汉模式&#xff0c;以及如何解决懒汉模式造成线程的不安全问题。 目录 什么是单例模式&#xff1f; 1. 饿汉模式 2. 懒汉模式 2.1 懒汉模式单线程版 2.2 懒汉模式多线程版 3. 解决懒汉模式不安全问题 3.1 保证原子性 3.2 防止指令重排序…

MAC移动硬盘无法识别解决方案(超详细图文教程)

目录 步骤1&#xff1a;先找到外接移动硬盘&#xff0c;在 Mac “终端”执行命令 步骤2&#xff1a;加载移动硬盘&#xff0c;可以在终端执行以下两个命令之一 步骤3&#xff1a;终止后台自动执行的“磁盘修复进程” 步骤4&#xff1a;手动执行磁盘修复命令 步骤5&#xf…

lwIP更新记01:全局互斥锁替代消息机制

从 lwIP-2.0.0 开始&#xff0c;在 opt.h 中多了一个宏开关 LWIP_TCPIP_CORE_LOCKING&#xff0c;默认使能。这个宏用于启用 内核锁定 功能&#xff0c;使用 全局互斥锁 实现。在之前&#xff0c;lwIP 使用 消息机制 解决 lwIP 内核线程安全问题。消息机制易于实现&#xff0c;…

基于Linux安装Docker

Docker官网&#xff1a;Docker Docs: How to build, share, and run applications | Docker Documentation 学习任何技术&#xff0c;一定要参考相应的官网学习&#xff0c;一定要参考官网学习&#xff01;&#xff01;&#xff01; 目录 一、环境准备 1.1 配置源 1.1.1 下载…

Vue+uniapp桃源婚恋交友APP 安卓小程序 nodejs java python

小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 开发模式&#xff1a;混合开发本文先提出了开发基于小程序的桃源婚恋交友APP系统的背景意义&#xff0c;然后通过功能性和非功能性分析阐述本系统的需求&#xff0c;然后进行系统设计。技术实现部分选择Jav…

c++ 11标准模板(STL) std::set(九)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

vue参照企业微信日程写一个小组件

今天公司要求做日程 这体的话 和企业微信的日程功能挺想的 也没有找到特别好的工具 就直接自己手敲了一个 先看效果 因为样式使用 sass 写的 所以 项目中要引入 sass 感兴趣的 可以把代码拿去二开一下 <template><section class "skeletonPositioning"…

Java线程概述 (一)线程介绍

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1fa85;什么是程序 、进程、线程&#xff1f;&#x1fa85;线程的生命周期&#x1fa85;多线程&#x1fa85;守护者线程&#x1fa85;线程并行与并发&#x1fa85;死锁&#x1f…

机器学习项目实战-能源利用率 Part-4(模型构建)

博主前期相关的博客可见下&#xff1a; 机器学习项目实战-能源利用率 Part-1&#xff08;数据清洗&#xff09; 机器学习项目实战-能源利用率 Part-2&#xff08;探索性数据分析&#xff09; 机器学习项目实战-能源利用率 Part-3&#xff08;特征工程与特征筛选&#xff09; 这…

AList挂载工具安装搭建使用教程,快速访问多个网盘的资源(保姆级图文)

目录 1. 下载AList2. 命令行启动快速启动小技巧 3. 用户登录4. 添加阿里云网盘帐号5. 添加百度云网盘资源总结 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 欢迎关注 『发现你走远了』 博客&#xff0c;持续更新中 软件功能&#xff1a;将多个网盘的资源聚合在一起&…