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

关于C++的花括号初始化的方式解释及示例

        花括号初始化列表的方式是从C++11开始引入的。这种初始化方式提供了许多优势,包括类型安全性、防止窄化转换以及统一的初始化语法,使得代码更加清晰和可读。

        下面是一些代码示例:

1. 基本数据类型初始化:

int x{5};         // 初始化整数变量 x 为 5
double y{3.14};   // 初始化双精度浮点数变量 y 为 3.14
char c{'A'};      // 初始化字符变量 c 为 'A'
bool flag{true};   // 初始化布尔变量 flag 为 true

2. 数组初始化:

int arr[]{1, 2, 3, 4, 5};  // 初始化包含5个元素的整数数组
char vowels[]{'a', 'e', 'i', 'o', 'u'};  // 初始化字符数组

3. 结构体初始化:

struct Point {int x;int y;
};Point p{10, 20};  // 初始化结构体对象 p 的成员 x 为 10,y 为 20

4. 类对象初始化:

class MyClass {
public:int data;std::string str;MyClass(int d, const std::string& s) : data(d), str(s) {}
};MyClass obj{42, "Hello"};  // 初始化类对象 obj,调用构造函数

5. STL容器初始化:

#include <vector>
#include <initializer_list>std::vector<int> vec{1, 2, 3, 4, 5};  // 初始化整数向量
std::vector<std::string> strVec{"apple", "banana", "orange"};  // 初始化字符串向量

6. 避免“most vexing parse”问题:

// 在某些情况下,使用括号初始化列表可以避免"most vexing parse"问题
int func{};  // 使用括号初始化列表避免了函数声明的歧义

        解释一下什么是“most vexing parse”问题。

        “Most vexing parse”是指在C++中的一个语法问题,可能导致代码解析出现歧义,从而引起程序员的困扰。这个问题通常发生在使用圆括号括起来的参数列表的地方,编译器可能将其解释为函数声明而非对象定义。

        具体来说,如果你使用类似如下形式的代码:

int x(); // 这看起来像是一个变量定义,但实际上是一个函数声明而非变量定义

        这个声明实际上会被解析为一个函数声明而不是定义一个返回整数的变量。这是因为在C++中,圆括号可以用于函数声明,表示函数接受无参数而返回某类型。这种情况被称为“most vexing parse”,因为程序员可能预期这是一个变量定义,但实际上是一个函数声明。

        为了解决这个问题,可以使用花括号初始化列表来明确表示变量初始化,例如:

int x{}; // 使用花括号初始化列表,明确表示变量初始化

        这样就避免了“most vexing parse”问题,确保了正确的变量定义。这是C++11及更高版本中花括号初始化列表引入的一个优点,使得代码更加清晰和容易理解。

相关文章:

  • AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?
  • 【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
  • 北斗卫星在物联网时代的应用探索
  • 2024牛客寒假算法基础集训营3
  • Three.js蒙皮骨骼变化原理 | 逆推蒙皮网格的世界位置
  • STM32CubeMX,定时器之定时功能,入门学习,如何设置prescaler,以及timer计算PWM输入捕获方法(重要)
  • 机器学习系列——(十五)随机森林回归
  • 【数据分享】1929-2023年全球站点的逐日平均风速数据(Shp\Excel\免费获取)
  • 搭建macOS开发环境-1:准备工作
  • 2.0 Zookeeper 安装配置
  • 从 F-Droid 安装 termux
  • 回归预测模型:MATLAB多项式回归
  • 深入探究 HTTP 简化:httplib 库介绍
  • MyBatis中#和$符的区别,sql注入问题,动态sql语句
  • 【Java】学习笔记:关于java.sql;
  • $translatePartialLoader加载失败及解决方式
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • CAP 一致性协议及应用解析
  • CSS 提示工具(Tooltip)
  • es的写入过程
  • Java到底能干嘛?
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • uni-app项目数字滚动
  • Vue.js 移动端适配之 vw 解决方案
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 闭包,sync使用细节
  • 码农张的Bug人生 - 初来乍到
  • 排序算法学习笔记
  • 一个完整Java Web项目背后的密码
  • 06-01 点餐小程序前台界面搭建
  • k8s使用glusterfs实现动态持久化存储
  • ​iOS安全加固方法及实现
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (多级缓存)多级缓存
  • (二)JAVA使用POI操作excel
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (转) Face-Resources
  • (转)jdk与jre的区别
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net 按比例显示图片的缩略图
  • .net 简单实现MD5
  • .net6Api后台+uniapp导出Excel
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • //解决validator验证插件多个name相同只验证第一的问题
  • :如何用SQL脚本保存存储过程返回的结果集
  • @RequestMapping处理请求异常
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [20170728]oracle保留字.txt
  • [autojs]逍遥模拟器和vscode对接
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [codevs] 1029 遍历问题