当前位置: 首页 > news >正文

强类型、类型安全

说 C++ 是类型安全的强类型语言,这句话其实不完全准确。更精确的说法是,C++ 是一门静态类型、强类型但并非完全类型安全的语言。

我们先来理解一下你提到的两个概念,以及它们在C++中的具体体现。

强类型(Strongly-typed)

强类型主要指的是,在语言中,不同类型的数据之间操作时,编译器会进行严格的类型检查。如果操作的数据类型不匹配,编译器会报错,除非你进行了明确的类型转换(Type Casting)。

例如,你不能直接将一个字符串赋给一个整型变量,或者将一个浮点数赋给一个整型变量而没有任何警告或转换。这种严格的检查有助于在编译阶段就发现潜在的错误,减少运行时的问题。

在 C++ 中,这种特性很明显:

int a = 10;
// 下面这行代码会报错,因为 "hello" 是字符串,和 int 类型不匹配。
// int b = "hello"; 
double c = 3.14;
// 下面这行代码会报警告或错误,因为将 double 赋给 int 可能会丢失数据。
// int d = c;

类型安全(Type-safe)

类型安全指的是,一个语言能够保证程序在运行过程中,不会出现由于类型不匹配而导致的未定义行为(Undefined Behavior)。也就是说,你无法通过任何方式(包括类型转换)来破坏类型的约束,从而访问或修改不属于该类型的数据。

C++ 在这方面并不是完全安全的。虽然编译器在大部分情况下会进行严格检查,但它提供了像 C 风格的强制类型转换(reinterpret_cast)这样的工具,可以让你绕过类型系统,直接将一块内存看作是另一种类型。这种操作是非常危险的,因为它允许你随意解释内存,可能导致程序崩溃、数据损坏或者安全漏洞。

例如,下面这个例子就展示了 C++ 不类型安全的一面:

int a = 65; // 'A' 的 ASCII 码
// 使用 reinterpret_cast 将 int 的内存地址直接解释为 char*
char* p = reinterpret_cast<char*>(&a); 
// p 指向的内存实际上是一个 int,但我们把它当成 char* 使用
// *p 打印出来会是 'A',看起来没问题。
// 但如果 a 的值很大,超出了 char 的范围,或者进行了更复杂的内存操作,就会导致未定义行为。

总结

强类型:关注的是 编译时 的类型检查,要求操作类型匹配。C++是强类型的,这有助于在早期发现错误。

“强类型”的定义是相对的,通常指的是语言的类型系统对类型转换的限制程度。在C++中,intfloat 之间的转换被认为是安全的,或者至少是可预测的,所以编译器允许这种隐式转换(Implicit Conversion)

类型安全:关注的是 运行时 的类型行为,保证不会出现由于类型不匹配而导致的未定义行为。C++并不是完全类型安全的,因为它的某些特性(如强制类型转换)允许程序员绕过类型系统,进行危险的内存操作。

因此,说 C++ 是静态类型和强类型的语言是准确的,但说它是类型安全的则需要加上限定条件,因为它给予了程序员极高的自由度,同时也带来了潜在的风险。正是这种自由度,让 C++ 在需要高性能和底层控制的领域(如游戏开发、嵌入式系统)中有着不可替代的地位。

那 C++ 也不是强类型啊?int 和 float 在很多情况下可以昏庸

你说得对,这是一个非常好的补充和疑问。你提到的 int 和 float 之间可以混用(在特定情况下隐式转换)这一点,确实是C++在“强类型”这个概念上不那么绝对的一个例子。

强类型与隐式转换
“强类型”的定义是相对的,通常指的是语言的类型系统对类型转换的限制程度。在C++中,int 和 float 之间的转换被认为是安全的,或者至少是可预测的,所以编译器允许这种隐式转换(Implicit Conversion)。

例如:

C++

float f = 10; // int 隐式转换为 float,没问题
int i = 3.14; // float 隐式转换为 int,但会丢失小数部分,编译器通常会给个警告
这和将一个字符串 string 赋给一个整数 int 完全是两码事。后者是完全不相干的类型,编译器会直接报错,因为这种操作是毫无意义且不安全的。

C++的类型系统:一个光谱
与其把C++简单地归类为“强类型”或“弱类型”,不如把它看作是一个介于两者之间的语言,但在光谱上更偏向于强类型。

强类型语言(Strongly-typed):严格限制不同类型之间的操作,除非进行显式转换。例如Python和Java,在这些语言中,将一个整数赋给一个浮点数是允许的,但将一个字符串赋给一个整数会报错。C++在这方面很像它们。

弱类型语言(Weakly-typed):类型可以随意转换,编译器或解释器在运行时会尽力去猜你想做什么。例如JavaScript。在JavaScript中,"10" + 5 可能会得到 "105"。这种行为在C++中是绝对不会发生的。

C++的类型系统设计理念是:能隐式转换的,都是开发者“很可能”想要,且转换后行为可预测的。 否则,就需要显式地告诉编译器“我就是要这么做”,也就是使用强制类型转换(Casting)。

结论:

C++之所以被称为强类型语言,是因为它和像JavaScript、PHP这种弱类型语言相比,类型约束要严格得多。但它又不像一些非常强类型的语言(比如Haskell),后者对类型转换的限制更加苛刻。

所以,更严谨的说法是,C++是静态类型语言,类型相对较强,但为了兼顾性能和灵活性,允许一些有限的隐式类型转换。

你提出的这个例子很好地说明了语言类型系统不是非黑即白的,而是一个连续的谱系。你对C++的理解非常深入,还想深入探讨C++的哪些特性呢?

相关文章:

强类型、类型安全

说 C++ 是类型安全的强类型语言,这句话其实不完全准确。更精确的说法是,C++ 是一门静态类型、强类型但并非完全类型安全的语言。 我们先来理解一下你提到的两个概念,以及它们在C++中的具体体现。 强类型(Strongly-typed) 强类型主要指的是,在语言中,不同类型的数据之间操…...

完整教程:数据结构——逻辑结构物理结构

完整教程:数据结构——逻辑结构&物理结构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !i…...

前端面试

题目 JS和TS区别类型JS:动态类型,变量类型在运行时确定,无需显示声明类型。 TS:静态类型,支持类型注解和编译时类型检查,可提前发现错误。编译与运行JS:直接由浏览器或者node.js,无需编译 TS:需要通过编译器(tsc)转换为JS代码后才能运行。语法扩展JS:仅支持基础的ECMAScrip…...

外置Tomcat启动Springboot项目后,请求参数中文乱码的问题解决 - yjry

首先按照常规的排查流程逐个进行配置,都是无效果的: 1、检查了tomcat的conf/server.xml里Connector标签有无配置URIEncoding="UTF-8",添加了配置,无效; 2、tomcat/bin/catalina.bat,添加了JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"配置,无效;…...

JSON字符串转换List对象列表 JSONArray toJavaList

JSON字符串转换List对象列表 JSONArray toJavaListJSON字符串转换List对象列表 JSONArray toJavaListpackage com.example.core.mydemo.java3.jsonDemo;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.example.core.mydemo.json2…...

gradle项目多模块中主模块加载子模块中的sqlmapper文件方法

gradle项目多模块中主模块加载子模块中的sqlmapper文件方法gradle项目多模块中主模块加载子模块中的sqlmapper文件方法 1.子模块 build.gradlesourceSets.main.resources { srcDirs = ["src/main/resources", "src/main/java"] // 包含Java目录下的XML…...

MCP - 使用 fastmcp 编写 Client 调用 MCP Serverr - Streamable HTTP (四)

xx源代码: mcp_server_tool_registry.zip...

全面理解MySQL架构

一条SQL查询执行的流程客户端 连接工具(Navacat,SQLyog,JDBC)都是客户端,主要用于发送执行SQL语句的请求 服务端 服务端可以分为server层和存储引擎层 server层 负责处理SQL语句, 解析, 优化, 缓存等. 负责权限管理, 用户认证等 提供了复制, 备份, 恢复等高级功能 Server层…...

Figma EX 125.7.5 UI原型设计

** 描述** Figma是一款专业的UI原型设计软件,Figma能够帮助团队创建、测试和发布更好的设计,Figma支持Windows和macOS 等多个平台,软件注意自适应屏幕大小、历史记录、导入Sketch文件等功能。它是一个真正为设计师而开发的设计软件,软件可以让网络设计变得简单。它能够创建…...

啥是CPU

啥是CPU?CPU即为中央处理器,一般决定CPU性能的参数有:频率,核心,线程,指令集频率决定了在相同架构下单CPU核心的运行速度,#核心数量一般决定了CPU处理多任务的能力,现在的绝大部分CPU都是多个核心组合成的线程则决定了核心和内存交换数据的速度某些CPU可能为了降低功耗…...

C# Avalonia 15- Animation- CodeAnimation

C# Avalonia 15- Animation- CodeAnimation例子展现了两种设置动画的方法,各位自行选择。CodeAnimation.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schema…...

vue3 使用 docx-preview 预览 Word文档

引入第三方库npm i docx-previewvue3创建组件<template><div><!-- 用于渲染文档的容器 --><div ref="previewContainer" class="preview-wrapper"></div></div> </template><script setup>import {define…...

数据库原理-第三章——SQL

Structured Query Language数据查询 Select数据操纵 Insert、Delete、Update数据定义 Create、Drop、Alter数据控制 Grant、Revoke事务处理 begin transaction、commit、rollback指针、游标控制(CCL) DECLARE CURSOR、FETCH INTO、UPDATE、WHERE CURRENT数据库的数据类型数值…...

ubuntu 18.04安装mysql 8.0.41

环境Os:ubuntu 18.04 desktop桌面版mysql:mysql:8.0.41 glibc2.17 查看操作系统信息root@db:~# ldd --version ldd (Ubuntu GLIBC 2.27-3ubuntu1) 2.27 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. Th…...

Topaz Photo AI Pro 4.0.4 AI图片智能降噪(win版)

描述 Topaz Photo AI是一款专业的人工智能图片降噪软件,得益于Topaz公司AI算法,这款照片修复软件可以在修复照片的同时运用人工智能算法AI模型计算图片模糊部分,自动修复图片受损的细节,以增强图片画质。利用未来的技术锐化、消除噪点并提高照片的分辨率。Topaz Photo AI 可…...

阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场

本次技术沙龙聚焦企业 AI 应用规模化实战痛点分享 Serverless、AI 网关、可观测、AI 消息队列产品解决方案和企业真实实践,与企业共同探讨如何通过向更先进的架构演进来适应 AI 时代的快速变化,为迎接新的增长机会做好准备。活动简介云为 AI 提供了坚实的基础设施支撑。聚焦阿…...

实用指南:LINUX910 CENTOS8 新建虚拟机;重设root密码/时间同步

实用指南:LINUX910 CENTOS8 新建虚拟机;重设root密码/时间同步pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&qu…...

零基础学习PYthon记录

变量会变化的 , 描述事物的状态 变量接收某个值定义变量 变量名 赋值符号 变量值 name = "david" print(name)不能使用关键字定义变量 定义的变量要有某种意义(看到变量名就要知道是干什么用的) 用下划线区分两个单词david_height = 180 print(david_height)常量固定…...

C++ std::unordered_set

std::unordered_set 是 C++ STL 中的无序关联容器,其核心特性是存储唯一元素且不保证元素顺序,底层基于哈希表实现,因此插入、查找、删除操作的平均时间复杂度为 O(1)。与 std::set(红黑树实现)相比,它更适合对查找速度有高要求且无需元素有序的场景。 1、底层数据结构与…...

如何将一个项目同时提交到GitHub和Gitee(码云)上

要将本地的一个项目同时提交到 GitHub 和 Gitee,可以通过配置多个远程仓库来实现,以下是具体步骤: 前提条件 确保你已经在 GitHub 和 Gitee 上分别创建了空的远程仓库,并且本地已经安装配置好了 Git,能够正常使用 Git 命令行进行操作。 操作步骤初始化本地仓库(如果还未初…...

基于Matlab的LeNet-5车牌字符识别系统实现

一、网络结构改进方案输入层调整输入尺寸:将LeNet-5原始输入尺寸(3232)调整为车牌字符标准尺寸(2828或4848) 通道扩展:增加颜色通道(RGB→灰度需归一化,或保留RGB通道)卷积层优化 layers = [imageInputLayer([28 28 1]) % 输入层convolution2dLayer(5, 6, Padding, sa…...

MATLAB的交通标志牌识别实现

MATLAB的交通标志牌识别实现,使用了颜色分割、形态学处理、模板匹配等核心技术一、核心识别流程设计图像预处理 灰度化与去噪 色彩空间转换(RGB→HSV/Lab) 颜色阈值分割(红色/蓝色/黄色区域提取) 几何特征提取 边缘检测(Canny算子) 形态学操作(腐蚀+膨胀) 轮廓分析(筛…...

Python常见的数据结构和代码示例

概述 Python 中常见的数据结构可以分为内置数据结构和扩展数据结构(主要来自第三方库)两类,以下是详细介绍: 一、内置数据结构(Python 自带) 这些是 Python 解释器原生支持的数据结构,无需额外导入模块。 1. 列表(List)特点:有序、可变(可修改)、允许重复元素,可存…...

Grafana 中文入门教程 | 构建你的第一个仪表盘

在大厂工作久了,时常对一些工具的存在觉得理所当然。 比如说,需要计算资源的时候,一个配置文件就可以要来两百台虚拟化好的机子。需要试下缓存?点下鼠标就可以要到几十个配置好的 Redis 结点。 最省心的是,这些工具都已经根据工作流配置好了:鉴权、优化、网络连接等等通通…...

Gitee DevOps:中国开发者效率革命的数字引擎

Gitee DevOps:中国开发者效率革命的数字引擎 在数字化转型浪潮席卷全球的当下,中国软件产业正面临前所未有的效率挑战。传统开发模式中的人工干预、碎片化工具链和低效协作已成为制约企业创新速度的关键瓶颈。Gitee DevOps作为本土领先的一站式开发运维平台,通过全流程自动化…...

Topaz Photo AI Pro 4.0.4 AI图片智能降噪

描述 Topaz Photo AI是一款专业的人工智能图片降噪软件,得益于Topaz公司AI算法,这款照片修复软件可以在修复照片的同时运用人工智能算法AI模型计算图片模糊部分,自动修复图片受损的细节,以增强图片画质。利用未来的技术锐化、消除噪点并提高照片的分辨率。Topaz Photo AI 可…...

C++ std::map

std::map 是 C++ STL 中最常用的有序键值对容器,其核心功能是存储唯一键(key)与对应值(value)的映射关系,并自动按键的顺序排序。底层基于红黑树(自平衡二叉搜索树)实现,这使得它在键的查找、插入、删除等操作上保持稳定的高效性。 1、底层数据结构与核心特性 1.1 底层…...

易基因:Nat Genet/IF29:董朝斌团队ChIP-seq等揭示作物株型穗型发育调控新机制 助力表观遗传育种驯化改良(顶刊佳作)

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,中国农业大学玉米生物育种全国重点实验室董朝斌教授为第一及共同通讯作者,美国加州大学伯克利分校George Chuck研究员为共同通讯作者,在国际遗传学Top期刊《Nature Genetics》发表了题为“A regulator…...

Edge浏览器网页长截图

长截图步骤1.在Edge浏览器中打开目标网页(需确保网页完全加载后再截图,否则可能截取不完整)‌‌2.按下‌Ctrl+Shift+S‌组合键3.选择截屏模式‌为捕获整页‌(自动滚动并截取整个网页,生成一张长图)‌‌4.截图后可直接复制或保存为图片文件...

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p=43881原文出处:拓端抖音号@拓端tecdat随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设备与管理系统,成为网络攻击的重点目标。传统入侵检测系统(IDS)要么难以处理IoT环境…...

C++多线程编程—线程控制、同步与互斥详解

本文将深入探讨C++多线程编程中的核心概念:线程控制、同步与互斥。 1.线程控制:join 与 detach当我们创建一个线程(std::thread)后,我们必须明确在这个线程对象销毁之前,如何管理它所代表的执行线程。这就是 join 和 detach 的用武之地。join()作用:阻塞当前线程(通常是…...

MySQL启动失败:mysqld.log Permis 报错处理.250916

报错:Could not open file /var/log/mysqld.log for error logging: Permis 解决办法: sudo setenforce 0 systemctl restart mysqld systemctl status mysqld如果好了,就更改selinux策略: sudo semanage fcontext -a -t mysqld_db_t "/home/mysql/data(/.*)?" …...

源码管理—密钥硬编码问题

源码管理—密钥硬编码问题目录密钥硬编码的定义: 指在代码、配置里硬编码密码/明文密码在配置文件中,但是不论是通过 AES 加密过的密码,还是将明文密码存储在远程配置文件中,都属于硬编码密钥。 常见的密钥硬编码场景:密钥放在环境变量 密钥加密存储在代码里 密钥放在服务…...

无速度传感器交流电机的扩展Luenberger观测器

扩展Luenberger观测器是一种用于无速度传感器交流电机控制的重要技术,它能够估计电机的内部状态(如转子磁链)和转速。 理论背景 对于感应电机,在静止α-β坐标系下的模型可以表示为: 状态方程: dx/dt = A(ω)x + Bu y = Cx其中: x = [isα, isβ, ψrα, ψrβ]^T u = […...

AI Ping体验记:终于有人做大模型服务的“性能监控”了

引言 最近几个月,我们公司在开发AI应用平台并集成到现有系统中。作为项目的技术选型负责人,我被MaaS平台API的选择问题折磨得不轻。面对市面上众多的大模型服务商,如何选出最适合我们的那一个,真的是个大难题。 市面上的MaaS平台越来越多,光是国内的就有20多家,这还是我知…...

数据库原理-第二章——关系型数据库

pass...

mac 的任务栏 Windows-Style Taskbar For macOS

https://lawand.io/taskbar/...

快手Java一面

线程池七大参数和作用?有大量执行时间短的任务如何设置线程池参数? Synchronized和ReentrantLock实现上的区别?哪个能尝试获取锁?tryLock方法参数是什么?返回是什么? ReentrantLock的公平锁和非公平锁怎么实现的? JVM堆内存怎么划分的? CMS垃圾回收机制下新生代和老年代…...

详细介绍:Elastic APM 入门指南:快速设置应用性能监控

详细介绍:Elastic APM 入门指南:快速设置应用性能监控pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

想找Axure替代?这6个原型设计工具值得一试

引言 在原型设计工具里,Axure可以说是最为经典、老牌的一款了。它在产品圈内有着较高的知名度和地位,但随着工具生态的不断丰富,越来越多产品经理在学习和使用Axure的过程中,逐渐放弃转为寻找Axure替代工具。其实,如今想找到能替代Axure的工具并不难,本文就为大家介绍6款…...

H5游戏性能优化系列-----cpu相关优化

cpu优化主要是优化cpu使用率,帧率平稳性(卡帧,长耗时任务),主要从以下几个方面优化设置合适的帧率。根据游戏类型设置合适的帧率,比如slg,回合制这种类型游戏一般开30帧,mmo等即时战斗的或者对流畅度有很高要求的可以开60帧。 帧同步与状态同步的抉择。一般来说状态同步会…...

IPA 混淆实战 IPA 混淆、IPA 加固、ipa 文件安全与成品包防护全流程指南

本文详解 IPA 混淆实战:为何做 ipa 混淆、Ipa Guard 在成品包加固中的角色、与源码混淆的区别、工具链(MobSF、class-dump、Frida)验证流程,以及灰度发布、白名单与映射表管理等落地经验,面向开发与安全团队。在移动应用交付链中,“源码混淆”与“成品 IPA 混淆”是两条互…...

实用指南:javaweb HTML基本介绍/常见标签

实用指南:javaweb HTML基本介绍/常见标签pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

文档处理控件Aspose.Words教程:在 C# 中将 Markdown 转换为 PDF

Markdown 被广泛用于使用纯文本语法创建格式化文本。许多开发人员喜欢用它来编写文档、注释和内容格式。然而,我们经常需要将Markdown文档生成专业的PDF文件。本文将学习如何借助Aspose.words for .NET,使用 C# 将 Markdown 转换为 PDF。Markdown 被广泛用于使用纯文本语法创…...

TCP协议与wireshark

...

docker容器mysql导入sql文件

sudo docker exec -i mysql8 mysql -u root -pSxygsj123 whpt_specialwork < /opt/sql/whpt-specialwork.sql...

ObjectSense 包与模块:代码组织的艺术

在编程世界中,随着项目规模扩大,代码的组织管理变得至关重要。ObjectSense 引入了包(Package)和模块(Module)机制,为代码的结构化管理提供了完美解决方案。 包:代码的基础组织单元 包是 ObjectSense 中最基础的代码组织形式,它通过目录结构与逻辑结构的统一,解决了命…...

IDE工具RAD Studio 13 Florence重磅发布:64 位 IDE + AI 组件全面升级!

近日,Embarcadero 正式宣布推出 RAD Studio 13 Florence,同时发布了 Delphi 13 与 C++Builder 13。这一版本带来了 全新的 64 位 RAD Studio IDE、更新的 C++Builder Clang 编译器、全新 Delphi 语言扩展、AI 组件与 AI 助手,并对现有功能进行了全面增强,重点聚焦在 质量与…...

C# 批量修改数据库

我这里有个例子,是整合数据后批次写入数据库的,只连接一次,希望对你有帮助using (SqlBulkCopy bc = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans)){bc.DestinationTableName = "ExamDetails";//要插入的表的表名bc.BatchSize = 10000;bc.ColumnMapp…...

Job for network.service failed because the control process exited with error code.

问题描述:VMware workstation 安装centos7启动后修改网络ip无效,报错;启动后主机还会蓝屏。 原因:windows10/11需要适配VMware workstation 16及以上,并打开虚拟配置。 解决方案:官网下载安装VMware workstation 17,17已经对个人免费。 新建虚拟机时,设置处理器》开启虚…...