从C到C++语法过度1

news2025/6/9 10:24:12

从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限定属性(即 constvolatile
  • 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();
    ...
    ...
}

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

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

相关文章

MATLAB遍历生成20到1000个节点的无线通信网络拓扑推理数据

功能&#xff1a; 遍历生成20到1000个节点的无线通信网络拓扑推理数据&#xff0c;包括网络拓扑和每个节点发射的电磁信号&#xff0c;采样率1MHz/3000&#xff0c;信号时长5.7s&#xff0c;单帧数据波形为实采 数据生成效果&#xff1a; 拓扑及空间位置&#xff1a; 节点电磁…

卫星接收天线G/T值怎么计算?附G/T计算excel表格链接

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

基于dify的营养分析工作流:3分钟生成个人营养分析报告

你去医院做体检&#xff0c;需要多久拿到体检报告呢&#xff1f;医院会为每位病人做一份多维度的健康报告吗&#xff1f;"人工报告需1小时/份&#xff1f;数据误差率高达35%&#xff1f;传统工具无法个性化&#xff1f; Dify工作流AI模型的组合拳&#xff0c;正在重塑健康…

新成果:GaN基VCSEL动态物理模型开发

作为高速数据传输与光电信号处理的核心器件&#xff0c;垂直腔面发射激光器&#xff08;VCSEL&#xff09;在高速光通信、激光雷达等领域应用广泛&#xff0c;其动态特性直接关联器件调制速率及稳定性等关键参数。近期&#xff0c;天津赛米卡尔科技有限公司技术团队开发了GaN基…

Appium+python自动化(十一)- 元素定位- 下

1、 List定位 List顾名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…

免费批量PDF转Word工具

免费批量PDF转Word工具 工具简介 这是一款简单易用的批量PDF转Word工具&#xff0c;支持&#xff1a; 批量转换多个PDF文件保留原始格式和布局快速高效的转换速度完全免费使用 工具地址 下载链接 网盘下载地址&#xff1a;点击下载 提取码&#xff1a;8888 功能特点 ✅…

Mac/iOS 如何解压 RAR 格式压缩包:常用工具与详细操作步骤

一、Mac 系统解压 RAR 文件之法 Mac 系统上解压 RAR 文件有多种方法&#xff0c;除了系统自带的一些简单功能外&#xff0c;还可以借助特定的软件来实现高效解压。以下将介绍几款常用工具的解压操作。 &#xff08;一&#xff09;解压专家解压步骤 解压专家 是一款在 Mac 和 …

机器学习监督学习实战四:九种回归算法对波士顿房价数据进行回归预测和评估方法可视化

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main 处理流程 1.导入波士顿房价数据集并进行预处理。2.使用 GradientBoostingRegressor 模型进行回归分析。3.通过交叉验证评估模型的性能&#xff0c;计算 MAE、…

微软重磅发布Magentic UI,交互式AI Agent助手实测!

微软重磅发布Magentic UI,交互式AI Agent助手实测! 何为Magentic UI? Magentic UI 是微软于5.19重磅发布的开源Agent助手,并于24日刚更新了第二个版本0.04版 从官方的介绍来看,目标是打造一款 以人为中心 的智能助手,其底层由多个不同的智能体系统驱动,能够实现网页浏览…

老年生活照护实训室建设规划:照护质量评估与持续改进实训体系

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

【python深度学习】Day 48 PyTorch基本数据类型与操作

知识点&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;模型会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机制&#xff0c;基本一致 作…

【大模型】【推荐系统】LLM在推荐系统中的应用价值

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏&#xff08;训练过程&#xff09;C.2 轻量推理&#xff08;部署过程&#xff09; D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;SLMRec&#xff1a;Distilling…

uni-app学习笔记二十九--数据缓存

uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中&#xff0c;如果有多个key相同&#xff0c;下面的会覆盖掉原上面的该 key 对应的内容&#xff0c;这是一个同步接口。数据可以是字符串&#xff0c;可以是数组。 <script setup>uni.setStorageSyn…

工作邮箱收到钓鱼邮件,点了链接进去无法访问,会有什么问题吗?

没事的&#xff0c;很可能是被安全网关拦截了。最近做勒索实验&#xff0c;有感而发&#xff0c;不要乱点击邮箱中的附件。 最初我们采用钓鱼邮件投递恶意载荷&#xff0c;发现邮件网关把我们的 exe/bat 程序直接拦截了&#xff0c;换成压缩包也一样拦截了&#xff0c;载荷始终…

基于安卓的线上考试APP源码数据库文档

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

【数据结构】顺序表和链表详解(下)

前言&#xff1a;上期我们从顺序表开始讲到了单链表的概念&#xff0c;分类&#xff0c;和实现&#xff0c;而这期我们来将相较于单链表没那么常用的双向链表。 文章目录 一、双向链表二&#xff0c;双向链表的实现一&#xff0c;增1&#xff0c;头插2&#xff0c;尾插3&#x…

【系统架构设计师】绪论-系统架构概述

目录 绪论 系统架构概述 单选题 绪论 系统架构概述 单选题 1、软件方法学是以软件开发方法为研究对象的学科。其中&#xff0c;&#xff08;&#xff09;是先对最高居次中的问题进行定义、设计、编程和测试&#xff0c;而将其中未解决的问题作为一个子任务放到下一层次中去…

SQL-事务(2025.6.6-2025.6.7学习篇)

1、简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 默认MySQL的事务是自动提交的&#xff0c;也就是说&#xff0…

Virtex II 系列FPGA的配置原理

对FPGA 芯片的配置&#xff0c;本质上是将根据设计生成的包含配置命令和配置数据的比特流文件写入到配置存储器中。 1 配置模式 Virtex II 系列FPGA 一共有五种配置模式&#xff0c;配置模式的选择是根据管脚M[2:0]来决定。 &#xff08;1&#xff09;串行配置模式 串行配置模…

蓝桥杯 国赛2024python(b组)题目(1-3)

第一题 试卷答题页 - 蓝桥云课 问题描述 在今年蓝桥杯的决赛中&#xff0c;一共有 1010 道题目&#xff0c;每道题目的分数依次为 55 分&#xff0c;55 分&#xff0c;1010 分&#xff0c;1010 分&#xff0c;1515 分&#xff0c;1515 分&#xff0c;2020 分&#xff0c;2020 分…