C/C++中{}的用法总结(全)

C++基础专栏:http://t.csdnimg.cn/UjhPR

目录

1.定义初始化列表(Initializer List)

2.类成员初始化列表

3.无默认构造函数的类的默认初始化(C++11 及以后版本)

4.初始化器列表构造函数(C++11 及以后版本)

5.定义枚举类型(Enum Types)

6.代码块(作用域)

7.定义Lambda函数(Lambda Expressions)

8.总结


1.定义初始化列表(Initializer List)

        列表初始化是一种全新的初始化方式,它可以用于任何类型的对象,包括基本类型、数组、结构体和类。

        例如,下面的 C++ 代码展示了如何使用列表初始化:

int a[]{1, 3, 5, 77, 78};  //使用列表初始化初始化数组
int arr[] = {1, 2, 3, 4, 5}; // 初始化整数数组
std::vector<int> vec = {10, 20, 30}; // 初始化整数向量
struct Point { int x, y; };
Point p = {5, 7}; // 初始化结构体
int  b{2352};  //初始化变量

在编程中,窄化转换是一种常见的问题。窄化转换是指一种可能丢失信息的转换,例如从浮点数转换到整数或从大整数转换到小整数。列表初始化可以帮助我们避免这种转换。

例如,下面的代码尝试用一个浮点数初始化一个整数:

int c{ 8.52 }; //编译错误

这段代码无法编译,因为 {8.52} 试图将浮点数转换为整数,这是一种窄化转换。通过这种方式,我们可以在编译时检测到这种可能的错误,防止数据丢失。

2.类成员初始化列表

在类的构造函数中,花括号可以用于成员初始化列表。

class MyClass {
public:MyClass(int x, int y) : a{x}, b{y} {}
private:int a, b;
};

在这个例子中,MyClass的构造函数使用列表初始化来初始化 a, b。这就保证了 MyClass在对象创建时总是被正确地初始化。

使用列表初始化来初始化类的成员变量有几个好处。

1)它可以避免成员变量的未初始化。如果我们忘记在构造函数中初始化一个成员变量,那么这个成员变量的值就会是未定义的,这可能会引发各种难以预测的问题。使用列表初始化可以确保成员变量总是被初始化,即使我们忘记在构造函数中初始化它。

2)提高效率。成员初始化列表在对象创建时直接初始化成员变量,而不是先创建成员变量,然后再为其赋值。这意味着使用成员初始化列表通常比在构造函数体内为成员变量赋值更高效。例如:

class CMyTestClassA
{
public:CMyTestClassA(int i = 0): m_i{ i } {//1}
private:int m_i;
};class CMyTestClassAHelper1
{
public:CMyTestClassAHelper1() : m_a{ 100 } {//2}
private:CMyTestClassA m_a;
};class CMyTestClassAHelper2
{
public:CMyTestClassAHelper2() {m_a = { 100 };//3}
private:CMyTestClassA m_a;
};int main()
{CMyTestClassAHelper1 m;CMyTestClassAHelper2 n;return 0;
}

        定义变量m在2处利用初始化列表构造初始化了m_a,在1处调用了一次CMyTestClassA的构造函数。
        定义变量n在3处看似只写了一行代码m_a={100}, 殊不知这个地方实际上初始化了两次m_a, 第一次是利用初始化列表构造初始化了m_a,这个和m的m_a构造差不多; 第二次是m_a = { 100 },
这里赋值又调用了一次构造函数,实际上在3处调用了两次构造函数; 在类比较简单的时候,多走一遍构造流程算不了什么; 在类比较复杂的时候,就会严重影响程序的执行效率,多次初始化,也有可能给程序带来一些未知的影响。

3.无默认构造函数的类的默认初始化(C++11 及以后版本)

对于没有默认构造函数的类,花括号可以用于默认初始化。

class NoDefaultConstructor {
public:NoDefaultConstructor(int x) { /* constructor code */ }
};
NoDefaultConstructor a = {1000}; // 使用初始化列表构造函数

4.初始化器列表构造函数(C++11 及以后版本)

花括号可以用于调用初始化器列表构造函数,这在创建对象时非常有用。

std::vector<int> vec = {44,5,99};
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};

之所以std::vector、std::map等容器可以用{}构造,那是因为有std::initializer_list的存在。std::initializer_list在中间起了一个桥梁的作用,{}表达式、std::initializer_list和容器构造之间的转换流程如下图所示:

std::initializer_list的用法可参阅我的另外一篇博客:

深入理解可变参数(va_list、std::initializer_list和可变参数模版)-CSDN博客

5.定义枚举类型(Enum Types)

{} 可以用于定义枚举类型,其中包含一组可能的值。例如:

enum myEnum {Opt1,Opt2,Opt3
};//C++11之后版本可以加class,限制枚举的作用域,如:
enum class myEnum {Opt1,Opt2,Opt3
};

6.代码块(作用域)

        花括号用于创建代码块,也就是一个作用域。在一个代码块中,可以定义局部变量,控制变量的作用范围,以及变量的生命周期。代码块可以在函数、条件语句、循环语句等地方使用。如:

void exampleFunction()
{int x = 10;{int y = 20; // 局部变量 y 只在此代码块内可见}// y 在这里不可见
}

很多时候{}代码块配合RAII自动释放资源。如下:

void TimeWheelScheduler::Stop() {{std::lock_guard<std::mutex> lock(mutex_);stop_ = true;//当lock离开这个作用域时,它会自动调用mutex_的unlock}thread_.join();
}

在这个例子中,当lock离开其作用域时,std::lock_guard的析构函数会被调用,从而释放锁对象mutex_。这种自动管理锁方式避免了手动调用unlock可能导致的错误。

C++惯用法之RAII思想: 资源管理-CSDN博客

7.定义Lambda函数(Lambda Expressions)

{} 可以用于定义Lambda函数。Lambda函数是一种匿名的函数对象,可以在函数中传递。例如:

auto lambda = [](int x) {return x * x;
};

8.总结

        在 C++ 中,我们建议尽可能使用列表初始化(即大括号 {})。这种初始化方式可以提供更一致的语法,防止窄化转换,避免 “最令人困惑的语法” 问题,还可以用于初始化任何类型的对象,包括基本类型、数组、结构体,以及类的成员变量。此外,我们还应该养成总是初始化变量的习惯,以避免未初始化的变量引发的未定义行为。

        通过掌握 C++ 的初始化规则,我们可以编写出更安全、更清晰、更易于理解的代码,这将有助于我们更好地表达思想,解决问题。

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

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

相关文章

计算机网络——分组延时、丢失和吞吐量

分组延迟是指从发送方发送数据包到接收方接收到数据包所经历的时间。 分组时延的四种类型&#xff1a; 传输时延、传播时延、排队时延、节点处理时延。 传输时延&#xff1a;传输时延是指分组从发送方到接收方所需的时间&#xff0c;取决于分组的长度和链路的传输速率。传输时…

centos配置nginx自动启动

查看是否存在相应的服务&#xff0c;如下&#xff0c;有nginx.service [rootnode142 ~]# systemctl list-unit-files |grep nginx nginx.service disabled 第一步&#xff1a;进入到/lib/systemd/system/目录 cd /lib/systemd/system 第二步&#xff1a;创建nginx.service文…

Docker学习之镜像管理(超详解析)

Docker镜像生命周期&#xff08;可以把docker镜像理解为虚拟机镜像&#xff09; 实验内容&#xff1a; 搜索官方仓库镜像 [rootlocalhost ~]# docker search busybox //以查找busybox为例 搜索说明&#xff1a;name镜像名称 description镜像说明 stars点赞数量 official…

四川宏博蓬达法律咨询有限公司:法律服务的行业翘楚

在当今社会&#xff0c;法律服务已经成为人们生活中不可或缺的一部分。随着法律意识的提高&#xff0c;选择一家专业、可靠的法律咨询公司显得尤为重要。四川宏博蓬达法律咨询有限公司&#xff0c;作为业内的佼佼者&#xff0c;以其卓越的服务质量和广泛的业务范围&#xff0c;…

Nacos 集群搭建

1 . 集群结构图 : 其中包括3个nacos结点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx ; 我们计划的集群结构 : 三个nacos结点的地址 : 节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.18847 2 . 搭建集群 搭…

Unity_PUN2多人联机API汇总

PUN2多人联机API汇总 代码仅为函数区别和属性展示&#xff0c;并不针对指定功能 按照需要调用即可 服务器相关API和回调 #region 服务器相关public void 连接服务器(){PhotonNetwork.ConnectUsingSettings();PhotonNetwork.GameVersion "1";}public void 离开服务…

2024最新轻量应用服务器简介_轻量应用服务器购买指南

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别便宜&#xff0c;大带宽&#xff0c;但是限制月流量&#xff0c;轻量2核2G3M带宽61元一年、2核2G4M优惠价99元一年&#xff0c;540元三年、2核4G5M带宽165元一年&#xff0c;…

JAVA初阶数据结构(链表)练习(这些可以作为java包中的方法)

这里的每一个题大家都要仔细完成&#xff0c;这些题目每个我都至少思考了两个小时左右&#xff08;沉重心&#xff0c;慢慢来&#xff09; 1.反向链表的实现&#xff08;对链表进行翻转&#xff09;&#xff08;力扣有&#xff09; &#xff08;1&#xff09;图示 &#xff0…

扭矩VS转角法的优缺点——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 在机械工程中&#xff0c;螺栓拧紧是一个至关重要的步骤&#xff0c;它直接关系到设备的安全性和性能。在众多螺栓拧紧方法中&#xff0c;扭矩法和转角法是最常用的两种。本文将对这两种方法进行详细的对比&#xff0c;…

C语言(指针)单元练习三

1下列语句的输出结果是______。C int **pp,*p,a5,b8; pp&p;p&a;p&b;printf("%d,%d",*p,**pp); A. 5,8 B.8,5 C. 8,8 D. 5,5 2如下程序的输出结果是______。B #include <stdio.h> #include <ctype.h> #include <stri…

2024考研国家线公布,各科分数线有哪些变化?考研国家线哪些涨了,哪些跌了?可视化分析告诉你

结论在文章结尾 2024考研国家线 一、近五年国家线趋势图-学术硕士 文学 管理学 工学照顾专业 体育学 交叉学科 军事学 历史学 理学 享受少数名族照顾政策的考生 中医类照顾专业 教育类 艺术类 医学 工学 哲学 法学 农学 经济学 二、近五年国家线趋势图-专业硕士 中医 应用心理 …

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm&#xff0c;可能会导致原本的idea失效&#xff0c;注册码过期 3、taobao的npm过期&#xff0c;导致npm is sass执行不成功&#xff0c;需…

jvaweb 3-13

Element 后端开发 maven maven的作用 下载并配置环境变量 创建Maven项目 Maven坐标 依赖 Maven的依赖传递特性 以图表形式展示依赖 排除依赖 依赖范围 生命周期

普通小白现在做抖音小店还能赚到钱吗?千万不要忽视这几点

大家好&#xff0c;我是电商花花。 赚钱做生意的秘密&#xff0c; 很简单&#xff0c;就是积少成多&#xff0c;以小见大&#xff0c;然后和时间成为朋友。 而做抖音小店也是这样的一个道理&#xff0c;不管是新手小白还是老电商玩家&#xff0c;都是从一点一滴做起来的&…

C#使用自定义的泛型节点类接口 IBinaryTreeNode<T>实现二叉树类接口IBinaryTree<T> 及其方法

目录 1.首先&#xff0c;定义节点类接口 IBinaryTreeNode 2.第二&#xff0c;定义二叉树接口 IBinaryTree 3.第三&#xff0c;定义二叉树节点BinaryTreeNode(T value) 4.第四&#xff0c;二叉树方法实现 5.最后&#xff0c;用Main方法实现二叉树类接口IBinaryTree 及其方法…

如何使用vue定义组件之——父组件调用子组件

首先&#xff0c;我们需要创建两个组件模板template&#xff1a; <template id"father"><div><h3>我是父组件</h3><h3>访问自己的数据:</h3><h3>{{ msg }}</h3></div></template><template id"…

性能测试-数据库

一、数据库事务机制 ACID描述 1、原子性Atomicity&#xff1a;事务通常由多个语句组成。原子性保证将每个事务视为一个“单元”&#xff0c;该事务要么完全成功&#xff0c;要么完全失败 2、一致性Consistency&#xff1a;“一致”是指数据库中的数据是正确的&#xff0c;不存…

【2024-03-12】设计模式之模板模式的理解

实际应用场景&#xff1a;制作月饼 过程描述&#xff1a; 一开始&#xff0c;由人工制作月饼&#xff0c; 第一个&#xff1a;根据脑子里面月饼的形状&#xff0c;先涅出月饼的形状&#xff0c;然后放入面粉和馅料把开口合并起来。 第二个&#xff1a;根据脑子里面月饼的形状&…

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么&#xff1f;一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

iOS 17.4 Not Installed

iOS15以后&#xff0c;下载了xcode安装好后&#xff0c;并不会自动下载好模拟器&#xff0c;需要手动下载。 有两种下载方式 xcode下载 xcode -> Settings 打开面板 xcode下载虽然方便&#xff0c;但是有个问题是&#xff0c;这里下载如果断网了不会断点续传&#xff0c;…