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

C++ 变量的声明和初始化方式

下面是一些示例,展示了不同的初始化方式:

double r(3.0);   // 直接初始化
double s = 3.0;  // 复制初始化
double t{3.0};   // 列表初始化 (C++11 起)
这三种方式都将创建一个 double 类型的变量,并将其初始化为 3.0

这三种初始化方式在语义上有所不同:

  1. 直接初始化 (double r(3.0);): 这种方式在 C++ 中被称为直接初始化。它表示创建一个名为 rdouble 类型变量,并将其初始化为 3.0。直接初始化的语法使用圆括号。

  2. 复制初始化 (double s = 3.0;): 这是一种传统的初始化方式,称为复制初始化。它也表示创建一个名为 sdouble 类型变量,并将其初始化为 3.0。在复制初始化中,使用等号 = 将值赋给变量。

  3. 列表初始化 (double t{3.0};): 这是 C++11 引入的一种新的初始化方式,也被称为初始化列表。它使用花括号 {} 来初始化变量。列表初始化不仅可以用于变量声明,还可以用于数组、结构体、类等类型的初始化。列表初始化在一些情况下会更严格,例如对于窄化转换的检查。

但在 C++ 中,直接初始化和复制初始化之间有一些微妙的区别。通常,直接初始化更加高效并且可以用于更多的情况,因为它在声明的同时就执行了初始化操作。 

在大多数情况下,这三种初始化方式都可以使用,并且它们在结果上是等效的。然而,列表初始化在某些情况下会更加严格,并且在使用窄化转换时会进行检查,这使得它在某些情况下更加安全。

窄化转换案例:

double d = 10.5;
int i = d;               // 复制初始化,窄化转换,可能丢失精度int j = {10.5};          // 列表初始化,会导致编译错误,因为窄化转换是不允许的

复制初始化时,将 double 类型的值赋给 int 类型的变量 i,这会导致窄化转换,可能会丢失精度。

列表初始化时,将 10.5 赋给 int 类型的变量 j,这也会导致窄化转换,但是列表初始化对窄化转换进行了检查,因此会导致编译错误。列表初始化方式在这种情况下会更加严格,以避免可能导致错误的窄化转换。 

相关文章:

  • <Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色
  • 使用Spring的@Scheduled注解实现定时任务
  • 关于高版本 Plant Simulation 每次保存是 提示提交comm对话框的处理方法
  • 使用axios+vue在离开页面时中断网络请求
  • MATLAB算法实战应用案例精讲-【数模应用】Turf组合模型(附MATLAB、python和R语言代码实现)
  • Outpainting Inpainting
  • RTA GMH系列 SERIE MOTION电机驱动板手侧 英文版
  • 【Web API DOM03】事件监听
  • VRRP
  • 创新指南|领导者如何评估自己的表现——麦肯锡专有的CEO卓越评估工具
  • 淘宝api接口是什么意思?api接口申请资格是什么?
  • echarts绘制三维柱状图
  • WordPress中借助Table of Contents Plus+Widget Options插件,实现仅在文章侧边栏显示文章目录的功能
  • Ubuntu server 24 (Linux) IPtables 双网卡 共享上网NAT 安装配置DHCP
  • Lambda 表达式练习
  • eclipse(luna)创建web工程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Linux gpio口使用方法
  • node入门
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue 重置组件到初始状态
  • vue自定义指令实现v-tap插件
  • XML已死 ?
  • 回流、重绘及其优化
  • 如何胜任知名企业的商业数据分析师?
  • 用Canvas画一棵二叉树
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • # 数据结构
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (C#)一个最简单的链表类
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (多级缓存)多级缓存
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)ssm高校实验室 毕业设计 800008
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .gitignore文件使用
  • .net(C#)中String.Format如何使用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net和php怎么连接,php和apache之间如何连接
  • .py文件应该怎样打开?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @angular/cli项目构建--Dynamic.Form
  • @EnableWebSecurity 注解的用途及适用场景
  • @RequestMapping用法详解
  • [ C++ ] STL_list 使用及其模拟实现
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [C++]unordered系列关联式容器
  • [CISCN 2023 初赛]go_session
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件