【C++11】详谈隐式类型转换

图片名称
🎉博主首页: 有趣的中国人

🎉专栏首页: C++进阶

🎉其它专栏: C++初阶 | Linux | 初阶数据结构

在这里插入图片描述

小伙伴们大家好,本片文章将会讲解 C++11中 隐式类型转换 的相关内容。


如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!

文章目录

  • `1. 关于C++11`
    • ==<font color = blue><b>🎧1.1 C++11简介🎧==
    • ==<font color = blue><b>🎧1.2 C++11官方介绍🎧==<br>
  • `2. 统一的列表初始化`
    • ==<font color = blue><b>🎧2.1 C/C++98 数组 & 结构体 初始化🎧==
    • ==<font color = blue><b>🎧2.2 单/多参数类型的隐式类型转换🎧==
  • `3. STL 中的 Initializer_list 构造函数`
    • ==<font color = blue><b>🎧3.1 Initializer_list 🎧==
    • ==<font color = blue><b>🎧3.2 Initializer_list 初始化容器 🎧==



1. 关于C++11


🎧1.1 C++11简介🎧


在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1), 使得 C++03 这个名字已经取代了 C++98 成为 C++11 之前的最新C++标准名称

不过由于 C++03(TC1) 主要是对 C++98 标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为 C++98/03 标准。从 C++0x 到C++11,C++ 标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

相比于 C++98/03,C++11 则带来了数量可观的变化,其中包含了约 140 个新特性,以及对 C++03 标准中约 600 个缺陷的修正,这使得 C++11 更像是从 C++98/03 中孕育出的一种新语言。相比较而言,C++11 能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要认真去学习。

🎧1.2 C++11官方介绍🎧



🎉官网链接: C++11



2. 统一的列表初始化


🎧2.1 C/C++98 数组 & 结构体 初始化🎧


在C/C++98中,标准允许使用花括号 { } 对数组或者结构体元素进行统一的列表初始值设定。比如:

struct Point
{int _x;int _y;
};int main()
{// struct Point类型的初始化Point p = { 100, 99 };int arr1[10] = { 10, 20, 30 };return 0;
}

🎧2.2 单/多参数类型的隐式类型转换🎧


对于自定义类型,如果是单参数类型的构造函数,会发生隐式类型转换,例如:

class A
{
public:A(int x): _x(x), _y(x){}void Print(){cout << _x << ":" << _y << endl;}private:int _x;int _y;
};int main()
{// 隐式类型转换A aa1 = 1;A aa2 = { 2 };// 直接构造A aa3(3);// 也可以省略等号A aa4{ 1 };return 0;
}

如果是多参数类型的构造函数,同样会发生隐式类型转换,例如:

class A
{
public:A(int x, int y): _x(x), _y(y){}private:int _x;int _y;
};int main()
{// 隐式类型转换A aa1 = { 1, 2 };// 也可以省略等号A aa2{ 3, 4 };// 可以省略等号A aa3(4, 5);return 0;
}

如果不想发生隐式类型的转换,可以在构造函数之前加上 explicit 关键字,例如:

class A
{
public:// 不允许发生隐式类型转换explicit A(int x, int y): _x(x), _y(y){}// 不允许发生隐式类型转换explicit A(int x): _x(x), _y(x){}void Print(){cout << _x << ":" << _y << endl;}private:int _x;int _y;
};int main()
{// 下面两行会报错A aa0 = 1;A aa3 = { 1 };A aa1 = { 1, 2 };// 以下可以正常使用A aa2{ 3, 4 };A aa4{ 0 };return 0;
}

关于单/多参数类型的构造函数的解释:

  1. 对于形如 A aa1 = { 1, 2 };的构造,编译器处理时会发生以下两个步骤:
    • 首先会利用 { } 中的值调用构造函数生成一个临时变量;
    • aa1 进行拷贝构造。
    • 但是编译器会优化成直接构造。
  2. 对于形如 A aa2{ 3, 4 };的构造,就会直接调用构造函数,不会产生临时变量。
  3. 如果产生了临时变量,我们知道临时变量具有常性,就有:
    • 如果用:A& aa1 = { 1, 2 };会报错。
    • 得用:const A& aa1 = { 1, 2 };



3. STL 中的 Initializer_list 构造函数


我们这里先以 vector 为例。


🎧3.1 Initializer_list 🎧


initializer_listC++11 引入的一种标准库类型,用于方便地初始化同一种类型的元素列表。initializer_list 允许通过大括号 { } 语法进行初始化,例如:

  std::initializer_list<int> my_list = {1, 2, 3, 4, 5};

这里 my_list 是一个包含了整数元素 {1, 2, 3, 4, 5}initializer_list<int> 对象。


主要特点包括:

  1. 不可变性: 一旦初始化完成,initializer_list 中的元素不可再被修改。
  2. 轻量:initializer_list 本身只包含指向数据的指针和长度信息,因此非常轻量,适合在函数参数传递和对象构造时使用。
  3. 语法简洁: 通过 { } 初始化列表的语法,能够清晰地指定一组初始值,而不需要显式地调用构造函数。


底层实现逻辑:

namespace std 
{template<class T>class initializer_list {public:using value_type      = T;using reference       = const T&;using const_reference = const T&;using size_type       = size_t;initializer_list() noexcept; // 构造一个空的 initializer_listsize_type size() const noexcept; // 返回列表中元素的个数const T* begin() const noexcept; // 返回指向第一个元素的指针const T* end() const noexcept; // 返回指向最后一个元素之后的位置的指针};
}

🎧3.2 Initializer_list 初始化容器 🎧


当使用vector时,每次都用不同数量的值初始化容器,那么就要写非常多的构造函数来实现这个需求。

但是用Initializer_list就可以一劳永逸的解决这个问题。

int main()
{// 用 10 个 1 构造 vectorvector<int> v(10, 1);initializer_list<int> il = { 10,9,8,5 };vector<int>(il);vector<int> v1 = { 1,2,3,4,5,6 };vector<int> v2({ 9,8,7,6,5,4 });return 0;
}

两种构造的区别:

  1. 对于:vector<int> v1 = { 1,2,3,4,5,6 };
    • 编译器会先将{ 1,2,3,4,5,6 }识别成initializer_list
    • 然后调用Initializer_list的构造,中间生成临时变量;
    • 最后拷贝构造给v1
    • 但是编译器会优化成直接构造。
  2. 对于:vector<int> v2({ 9,8,7,6,5,4 });
    • 这就是直接构造。
  3. 总的来说,形如:X自定义 = Y类型 一定发生了 隐式类型转换。X 支持 Y 为参数类型构造就可以。

对于 map 的 initializer_list 的构造

map 支持 pair 类型的 initializer_list 的构造:

在这里插入图片描述

这里的 value_type 就是 pair。


map构造代码示意:

int main()
{// 方法一:pair<string, string> kv1 = { "include", "包括" };pair<string, string> kv2 = { "sort","排序" };map<string, string> dict1({ kv1, kv2 });// 方法二:map<string, string> dict2 = { kv1, kv2 };map<string, string> dict3 = {{"include", "包括"}, { "sort","排序" }};return 0;
}

两种构造区别:

  1. 对于方法一:
    • 因为pair支持双参数的构造函数,所以{ "include", "包括" }{ "sort","排序" }会发生隐式类型的转换生成临时变量,然后再拷贝构造给kv1kv2(编译器会优化成直接构造);
    • 因为map 支持 pair 类型的 initializer_list 的构造,因此直接使用:map<string, string> dict1({ kv1, kv2 });即可
  2. 对于方法二:
    • {"include", "包括"}, { "sort","排序" }会被识别成两个pair类型;
    • 然后外层大括号会被识别成initializer_list,进行隐式类型转换,在进行拷贝构造(会被优化)。

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

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

相关文章

实现跑马灯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 跑马灯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Color[] colors { Color.Red, Color.Green, Color.Yellow };T…

JAVA每日作业day6.19

ok了家人们今天继续学习面向对象&#xff0c;话不多说看看今天学了什么 一.面向对象-封装 1&#xff0c;private private:私有的 权限修饰符 是一个成员修饰符&#xff0c;修饰成员变量 被private修饰的成员变量和成员方法只能在本类中使用 对外访问使用是 set XXX 和 get X…

IO流2.

字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…

pytorch库 02 Anaconda、Jupyter常用命令及操作

文章目录 一、Anaconda Prompt1、conda常用命令2、pip常用命令 二、Jupyter1、Jupyter常用命令及基本操作2、Jupyter代码补全插件安装 一、Anaconda Prompt 1、conda常用命令 下列命令可以在Anaconda Prompt中输入。 清屏&#xff1a; cls 查看帮助&#xff1a; conda -h 查…

海南聚广众达电子商务咨询有限公司抖音电商新引擎

在数字化浪潮席卷而来的今天&#xff0c;抖音电商作为新兴的商业模式&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;引领着电子商务行业的革新与发展。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队、丰…

【IPython的使用技巧】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

u-modal自带的取消和确认按钮都在上面

添加&#xff1a;:show-cancel-button"true" <u-modal:show"showbut":show-cancel-button"true"title"提示":content"content"confirm"confirm"cancel"onModalCancel"confirmText"确认"c…

GRIT论文阅读笔记

一篇试图统一生成任务和编码任务的工作&#xff0c;就是把只能完成生成任务的GPT改成既能生成又能encode。思路其实很简单&#xff0c;就是在输入的时候添加instruction tokens来指引模型做representation还是generation&#xff0c;然后各自算损失。representation任务用的是d…

Certificate数字证书的有效性验证

1.证书相关概念 在讲证书有效性验证的逻辑之前&#xff0c;先了解几个概念。 证书颁发机构&#xff1a;一般为运营数字证书的机构&#xff0c;该机构负责证书的签发、吊销等生命周期管理。证书链&#xff1a;证书颁发机构一般会由多个组成&#xff0c;为树状层级&#xff0c;第…

JWT整合Gateway实现鉴权(RSA与公私密钥工具类)

一.业务流程 1.使用RSA生成公钥和私钥。私钥保存在授权中心&#xff0c;公钥保存在网关(gateway)和各个信任微服务中。 2.用户请求登录。 3.授权中心进行校验&#xff0c;通过后使用私钥对JWT进行签名加密。并将JWT返回给用户 4.用户携带JWT访问 5.gateway直接通过公钥解密JWT进…

数据库 | 试卷五试卷六试卷七

1. 主码不相同&#xff01;相同的话就不能唯一标识非主属性了 2.从关系规范化理论的角度讲&#xff0c;一个只满足 1NF 的关系可能存在的四方面问题 是&#xff1a; 数据冗余度大&#xff0c;插入异常&#xff0c;修改异常&#xff0c;删除异常 3.数据模型的三大要素是什么&…

15. STUN协议和ICE工作原理

NET介绍 NAT是一种地址转换技术&#xff0c;它可以将IP数据报文头中的IP地址转换为另一个IP地址&#xff0c;并通过转换端口号达到地址重用的目的。 在大多数网络环境中&#xff0c;我们都需要通过 NAT 来访问 Internet。 NAT作为一种缓解IPv4公网地址枯竭的过渡技术&#xff…

AMBA-CHI协议详解(三)

《AMBA 5 CHI Architecture Specification》 AMBA-CHI协议详解&#xff08;一&#xff09; AMBA-CHI协议详解&#xff08;二&#xff09; AMBA-CHI协议详解&#xff08;三&#xff09; AMBA-CHI协议详解&#xff08;四&#xff09; 文章目录 2.3.2 Write transactions2.3.2.1 …

keil5显示内存和存储占用百分比进度条工具

简介 [Keil5_disp_size_bar] 以进度条百分比来显示keil编译后生成的固件对芯片的内存ram和存储flash的占用情况, 并生成各个源码文件对ram和flash的占比整合排序后的map信息的表格和饼图。 原理是使用C语言遍历当前目录找到keil工程和编译后生成的map文件 然后读取工程文件和m…

若依框架自定义开发使用学习笔记(1)

因为我是跳着学的&#xff0c;原理那些都没咋看。 代码自动生成&#xff0c;依赖sql表 在ruoyi数据库中&#xff0c;创建你想要的表&#xff0c;这里我创建了个购物车表&#xff0c;由于空间有限&#xff0c;只能拍到这么多。 然后就可以在前端自动生成代码 点击导入按钮 …

创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长

今天&#xff0c;很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”&#xff1f;初创公司的创始人为何需要重视这个策略&#xff1f;这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环&#xff08…

【Ruby基础01】windows和termux中搭建Ruby开发环境

windows下环境搭建 railsinstaller官方git地址 按照文档安装git、nodejs、yarn&#xff0c;安装教程百度一下。railsinstall可以从release页面下载最新版本4.1.0。 安装完成如下 安装RubyMine 下载RubyMine RubyMine下载地址 安装激活 下载文件&#xff0c;按照里面的流程…

Java 读取Excel导入数据库,形成树状结构

最近开发过程中遇到一个Excel的导入的功能,因为导入的数据结构具有层次结构,经过一番研究,最终得以实现,所有写下该文章,记录过程,供以后参考。 下图是导入Excel的数据结构: 使用POI解析Excel,数据封装然后进行入库。下面是核心代码。 @Overridepublic KnowledgeBase…

示例:WPF中如何不卡顿页面的情况加载大量数据

一、目的&#xff1a;在开发过程中经常会遇到一个ListBox列表里面需要加载大量数据&#xff0c;但是加载过程中会假死卡顿影响用户体验&#xff0c;或者是你的主页面加载了大量控件&#xff0c;或者切换到一个有大量元素的页面都会有这种体验&#xff0c;因为加载的都是UI元素不…

基于matlab的RRT算法路径规划(附带案例源码)

文章中的所有案例均为博主手动复现&#xff0c;用于记录博主学习路径规划的过程&#xff0c;如有不妥&#xff0c;欢迎在评论区交流 目录 1 标准RRT1.1 算法原理1.2 演示 2 GBRRT2.1 算法原理2.2 算法演示 3 RRT-STAR3.1 算法原理3.2 算法演示 4 RRT-CONNECT4.1 算法原理4.2 算…