从C到C++语法过度1
从C到C++语法过度1
文章目录
- 从C到C++语法过度1
- 1. 字符串string
- 2. 引用
- 3. 类型转换
- 3.1 新式转换 `const_cast`
- 3.2 新式转换 `static_cast`
- 4. 关键字auto
1. 字符串string
C语言从本质上来说,是没有字符串这种类型的,在C语言中如果要表达字符串,只能间接地借助于字符指针或者字符数组来表达,很明显这是由于C语言的诞生年代过于久远而导致的一种设计缺陷。
在C++中,字符串就跟整型、浮点型数据一样,是系统原生支持的一种基本数据类型:
string s;
有了字符串string这种类型之后,很多对字符串的操作就变得非常简单而直观了,C++对string类型的支持包括:
// 字符串的赋值
string s1 = "abdc";// 字符串的复制
string s2;
s2 = s1;// 字符串的拼接
string s3;
s3 = "xyz" + s1;
s3 += "123";// 字符串的比对
if(s1 == "abcd")cout << s1 << " == abcd" << endl;
else if(s1 > "abcd")cout << s1 << " > abcd" << endl;
else if(s1 < "abcd")cout << s1 << " < abcd" << endl;// 字符串中的元素引用
s1[1] = 'B'; // 将s1修改为"aBcd"
当然,字符串 string
类型数据的操作接口远远不止以上那些,基本上我们能想到的任何对字符串的操作,这个类型本身都支持的。
2. 引用
概念:给一个已有对象取一个别名
语法:
int a = 100;
int &ra = a; // 从此之后,a 跟 ra 是同一个变量,代表同一块内存
// 以下代码具有等价的作用a = 200;
ra = 200;
注意点:
- 引用必须在定义的同时赋值,不可单独定义引用,例如 int &r; 是错误的。
- 引用一方面提高了数据传输的效率,另一方面简化了数据表达的样式(跟指针相比)
3. 类型转换
对于数据类型转换,C++完全兼容C语言的类型转换语法,同时又新加了更合理的书写形式和更安全的新式类型转换,如下面所示:
旧式转换
(char)a; // C语言风格类型转换
char(a); // C++风格类型转换
新式转换
const_cast<char *>(a);
static_cast<char *>(a);
dynamic_cast<char *>(a);
新式转换是C++的全新特性,这几个转换关键字含义如下:
const_cast
: 专用于去除指针或引用的const
属性static_cast
: 与旧式转换相近,但提供了更易于查找的语法,并能有效识别不兼容类型。dynamic_cast
: 专用于类类型的上下代际间的转换
3.1 新式转换 const_cast
首先,先要明确 const_cast
的使用规范:
const_cast
旨在去除标识符的cv限定属性(即const
与volatile
)const_cast
只能作用于指针或引用类型
以下是 const_cast
的具体用法:
处理 const 型引用
int main()
{int i = 6; // 普通整型变量const int &ri = i; // const型引用,不可修改// ×: 以下语句错误ri = 8;// √: 去除 const 特性后,可以赋值const_cast<int &>(ri) = 8;
}
处理常目标指针
int main()
{int i = 6;const int *p = &i; // 常目标指针p,不可修改目标// ×: 试图修改常指针的目标,错误!*p = 8;// √: 去除 const 特性后,可以修改其目标*(const_cast<int *>(p)) = 8;// ×: 试图扩大权限,错误!int *k = p;// √: 去除 const 特性后,可赋值给普通指针 k int *k = const_cast<int *>(p);
}
注意,虽然 const_cast
可以将常目标指针的 const
属性剔除掉,但它不能剔除普通变量和常指针本身的 const
属性。例如:
int main()
{int i = 6; // 普通整型变量int *const p = &i; // 常指针int j = 8;// ×: p是常指针,无法修改其指向p = &j;// ×: const_cast 不能去除常指针的 const 属性const_cast<int *>(p) = &j;
}
上述代码以 const
属性为例,讨论变量的 volatile
属性时是完全一样的。
3.2 新式转换 static_cast
static
意味着静态转换,静态的含义是操作的过程只发生在编译阶段,而不是运行阶段,静态转换不涉及类型推理。
增加可读性
int main()
{float f = 3.14;// 旧式类型转换int i = (int)f;int i = int(f);// 新式静态转换,等价于旧式转换:// 但是,新式静态强转更具可读性,更容易被查找int i = static_cast<int>(f);
}
提高安全性
对于旧式类型转换,奉行了C语言的一贯作风:基本不进行任何逻辑判定,将灵活性和责任都丢给开发者。这样做的后果是可能会在某些比较难以察觉的地方埋下隐患,使用 static_cast
可以避免某些隐患。
int main()
{int i = 6; // 普通整型数据float *pf; // 普通浮点指针// 旧式转换不进行任何合理性检查// 下面的代码,可以将类型问题瞒天过海// 编译器让其畅行无阻,开发者肉眼也难以察觉pf = (float *)&i; // float * 与 int * 不兼容,照样通过编译// 使用 static_cast 遇到非兼容性类型转换,会提出警告甚至错误pf = static_cast<float *>(&i); // float * 与 int * 不兼容
}
注意,虽然 static_cast
可以将不兼容的普通数据类型转换明确指出来,但对于代际类类型的上下层转换无能为力,对于类类型的代际上行转换或下行转换,需要借助 dynamic_cast
去保证运行的安全性,这个知识点要等到学完类之后再展开。
4. 关键字auto
在C语言中,auto
用来声明一个存储在栈的变量,因此它只能用来修饰临时变量,不能用来修饰全局变量、静态变量,与此同时临时变量本身默认就是存储在栈中,因此在C语言中,auto
基本上是作废的。
在C++中,auto
代表自动获得数据的类型,比如:
auto a = 100; // 等价于: int a = 100;
当然,上述代码仅是语法示例,无法体现 auto
的价值,在C++的函数模板、类模板中,利用 auto
自动获得数据类型,往往有奇效,例如:
// 以下函数是一个模板,接收一个类型为 T 的容器
// 注意:类型 T 是动态的,可变的,不定的。
template <typename T>
void show(T &container)
{// 利用 auto 动态获取未知类型容器的相关数据auto it = container.begin();......
}
相关文章:
从C到C++语法过度1
从C到C语法过度1 文章目录 从C到C语法过度11. 字符串string2. 引用3. 类型转换3.1 新式转换 const_cast3.2 新式转换 static_cast 4. 关键字auto 1. 字符串string C语言从本质上来说,是没有字符串这种类型的,在C语言中如果要表达字符串,只能…...
AI是如何换装的?
AI换装是一种基于计算机视觉、深度学习和生成对抗网络(GAN)的技术,能够通过算法自动识别人像并更换服饰,实现虚拟换装的效果。这项技术广泛应用于电商服装试穿、虚拟偶像、影视特效、社交媒体滤镜等领域。 AI换装的核心技术 1. 图像分割与人体解析 换装的第一步是图像分…...

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据
功能: 遍历生成20到1000个节点的无线通信网络拓扑推理数据,包括网络拓扑和每个节点发射的电磁信号,采样率1MHz/3000,信号时长5.7s,单帧数据波形为实采 数据生成效果: 拓扑及空间位置: 节点电磁…...
python爬虫:grequests的详细使用(基于gevent和requests的异步HTTP请求库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、grequests 概述1.1 grequests 介绍1.2 注意事项1.3 替代方案比较1.4 基本组件1.5 grequests 安装二、基本用法2.1 创建请求任务2.2 发送请求并获取响应2.3 带参数的请求三、高级用法3.1 自定义回调函数3.2 设置超时…...
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
在使用PHP连接MySQL数据库时,可能会遇到连接失败和写锁问题。这类问题可能会影响应用的正常运行,本文将详细介绍排查和解决这些问题的方法。 一、PHP连接MySQL数据库失败 1. 排查连接失败的常见原因 数据库配置错误: 检查数据库主机、用户名…...

卫星接收天线G/T值怎么计算?附G/T计算excel表格链接
我们在进行无线通信链路设计时,都会涉及接收天线最重要的参数G/T。今天,咱们就来聊聊G/T值该怎么计算,计算过程中有哪些需要留意的地方,以及当你看到产品说明书中标注了G/T指标,还需要进一步了解哪些信息。 G/T的含义 …...

基于dify的营养分析工作流:3分钟生成个人营养分析报告
你去医院做体检,需要多久拿到体检报告呢?医院会为每位病人做一份多维度的健康报告吗?"人工报告需1小时/份?数据误差率高达35%?传统工具无法个性化? Dify工作流AI模型的组合拳,正在重塑健康…...
Kali Linux 安全工具解析
Kali Linux 安全工具解析 目录 Kali Linux 安全工具解析一、Kali Linux 概述1.1 核心特性1.2 系统要求 二、核心工具分类与实战应用2.1 信息收集工具2.1.1 Nmap2.1.2 Recon-ng2.1.3 theHarvester 2.2 漏洞利用工具2.2.1 Metasploit Framework2.2.2 SQLMap2.2.3 Burp Suite 2.3 …...
端午编程小游戏--艾草驱邪
刚刚过去的端午,参加了学校的一个活动,用python做了一个小游戏,当然这个小游戏还可以继续改进,可以加个bgm什么的...... 可以小玩一下 import pygame import random import math import sys import timepygame.init() pygame.mi…...

新成果:GaN基VCSEL动态物理模型开发
作为高速数据传输与光电信号处理的核心器件,垂直腔面发射激光器(VCSEL)在高速光通信、激光雷达等领域应用广泛,其动态特性直接关联器件调制速率及稳定性等关键参数。近期,天津赛米卡尔科技有限公司技术团队开发了GaN基…...
0x-4-Oracle 23 ai-sqlcl 25.1.1 独立安装-配置和优化
一、独立安装sqlcl 1. 安装 Java 环境 SQLcl 需要 Java 1.8.0_220 或更高版本, Oracle Linux9.6 上已经默认安装Oracle 23ai后Java 是11 lts版本 如果java jdk安装错误将遇上SQLcl困扰n多人的bug sql /nolog 错误:找不到或加载主类 oracle.dbto…...

Appium+python自动化(十一)- 元素定位- 下
1、 List定位 List顾名思义就是一个列表,在python里面也有list这一个说法,如果你不是很理解什么是list,这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合,那么他的个数也就成了不确定性,所以这里需要用复…...

免费批量PDF转Word工具
免费批量PDF转Word工具 工具简介 这是一款简单易用的批量PDF转Word工具,支持: 批量转换多个PDF文件保留原始格式和布局快速高效的转换速度完全免费使用 工具地址 下载链接 网盘下载地址:点击下载 提取码:8888 功能特点 ✅…...
OD 算法题 B卷【水果摊小买卖】
文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱,想做点水果买卖,给出两个数组m, n, m[i]表示第i个水果的成本价,n[i]表示第i个水果能卖出的价格;假如现在有本钱k,试问最后最多能赚多少钱࿱…...

Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤
一、Mac 系统解压 RAR 文件之法 Mac 系统上解压 RAR 文件有多种方法,除了系统自带的一些简单功能外,还可以借助特定的软件来实现高效解压。以下将介绍几款常用工具的解压操作。 (一)解压专家解压步骤 解压专家 是一款在 Mac 和 …...
二进制安全-IDA Pro-API
idaapi 是 IDA Pro(Interactive Disassembler Professional) 反汇编工具的 Python API 接口,用于开发自动化脚本、插件和自定义分析工具。通过 idaapi,开发者可以访问 IDA Pro 的核心功能(如反汇编、符号分析、交叉引用…...

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化
本项目代码在个人github链接:https://github.com/KLWU07/Machine-learning-Project-practice/tree/main 处理流程 1.导入波士顿房价数据集并进行预处理。2.使用 GradientBoostingRegressor 模型进行回归分析。3.通过交叉验证评估模型的性能,计算 MAE、…...
1. Web网络基础 - IP地址核心知识解析
深入解析IP地址与ipconfig命令:网络工程师的必备技能 在网络世界中,IP地址是设备通信的基石。本文将全面解析IP地址的核心概念,并通过ipconfig命令实战演示如何获取关键网络配置信息。 一、IP地址核心知识解析 1. IP地址的本质 定义&#x…...

微软重磅发布Magentic UI,交互式AI Agent助手实测!
微软重磅发布Magentic UI,交互式AI Agent助手实测! 何为Magentic UI? Magentic UI 是微软于5.19重磅发布的开源Agent助手,并于24日刚更新了第二个版本0.04版 从官方的介绍来看,目标是打造一款 以人为中心 的智能助手,其底层由多个不同的智能体系统驱动,能够实现网页浏览…...
c# 完成恩尼格玛加密扩展
c# 完成恩尼格玛加密扩展 恩尼格玛扩展为可见字符恩尼格玛的设备原始字符顺序转子的设置反射器的设置连接板的设置 初始数据的设置第一版 C# 代码第二版 C# 代码 总结 恩尼格玛 在之前,我们使用 python 实现了一版恩尼格玛的加密算法,但是这一版&#x…...
华为 “一底双长焦” 专利公布,引领移动影像新变革
6 月 6 日,国家知识产权局公布的一项专利发明申请吸引了众多目光,该专利发明人为华为技术有限公司,名为 “光学镜头、摄像头模组及电子设备” 。从展示的技术图来看,这一光学镜头呈现出独特的 “一底双镜头结构”,其中…...

老年生活照护实训室建设规划:照护质量评估与持续改进实训体系
随着人口老龄化程度的不断加深,老年生活照护需求日益增长,对专业照护人才的培养提出了更高要求。老年生活照护实训室建设方案作为培养高素质照护人才的重要载体,其核心在于构建科学完善的照护质量评估与持续改进实训体系。通过该体系的建设&a…...

【python深度学习】Day 48 PyTorch基本数据类型与操作
知识点: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,模型会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 作…...
Go深入学习延迟语句
1 延迟语句是什么 编程的时候,经常会需要申请一些资源,比如数据库连接、文件、锁等,这些资源需要再使用后释放掉,否则会造成内存泄露。但是编程人员经常容易忘记释放这些资源,从而造成一些事故。 Go 语言直接在语言层…...

【大模型】【推荐系统】LLM在推荐系统中的应用价值
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏(训练过程)C.2 轻量推理(部署过程) D 实验设计E 个人总结 A 论文出处 论文题目:SLMRec:Distilling…...

uni-app学习笔记二十九--数据缓存
uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中,如果有多个key相同,下面的会覆盖掉原上面的该 key 对应的内容,这是一个同步接口。数据可以是字符串,可以是数组。 <script setup>uni.setStorageSyn…...
csharp基础....
int[][] jaggedArray new int[3][]; jaggedArray[0] new int[] { 1, 2 }; jaggedArray[1] new int[] { 3, 4, 5 }; jaggedArray[2] new int[] { 6, 7, 8, 9 }; 嵌套 反转和排序 List<int> list new List<int> { 1, 2, 3, 4, 5 }; list.Reverse(); Cons…...
【C/C++】EBO空基类优化介绍
空对象优化(Empty Base Optimization,简称 EBO)是 C 编译器的一种 优化技术,用于消除空类作为基类时占用的内存空间,从而避免浪费空间、提升结构体或类的存储效率。 1 什么是“空对象”? 一个**空类&#…...

工作邮箱收到钓鱼邮件,点了链接进去无法访问,会有什么问题吗?
没事的,很可能是被安全网关拦截了。最近做勒索实验,有感而发,不要乱点击邮箱中的附件。 最初我们采用钓鱼邮件投递恶意载荷,发现邮件网关把我们的 exe/bat 程序直接拦截了,换成压缩包也一样拦截了,载荷始终…...

基于安卓的线上考试APP源码数据库文档
摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…...