iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11中列表初始化机制的概念是什么
  • 756
分享到

C++11中列表初始化机制的概念是什么

2023-06-25 13:06:32 756人浏览 薄情痞子
摘要

本篇内容介绍了“c++11中列表初始化机制的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述定义:列表初始化是C++11引入的新

本篇内容介绍了“c++11中列表初始化机制的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    概述

    定义:列表初始化是C++11引入的新标准,目的是统一初始化方式

    C++11以前只能使用列表初始化来初始化内置类型数组和POD类型对象,C++11中列表初始化可以用于初始化任何类型对象

    • POD(plain old data)类型:仅由内置类型变量构成且不含指针的类,简单来说是可以直接使用memcpy复制的对象

    • 聚合体(aggregate):聚合体一定是POD类型

      • 无自定义构造函数

      • 无私有或保护的非静态数据成员(静态成员与单独对象无关,故不影响初始化)

      • 无基类

      • 无虚函数

      • 无类内已经初始化的非静态数据成员

    注意:区分列表初始化和初始化列表

            列表初始化:用{}进行初始化的方式

            初始化列表:构造函数体前对对象成员直接进行初始化的列表

            initializer_list:一种用于未定参数的轻量STL容器

    实现机制详解

    对内置类型对象、POD对象和类对象的列表初始化实现细节是不同的

    POD类型的列表初始化

    • 此处POD类型包括:内置类型、聚合体类

    • 内置类型数组按照顺序初始化

      • C++11标准中列表初始化会防止可能导致潜在信息丢失的类型缩小(即不能像赋值一样将大类型如int隐式转换成小类型如char)

    • 聚合体类按照成员定义顺序依次初始化

    含有构造函数的类的列表初始化(C++11)

    • 通过{}进行初始化和()结果一致【即通过()调用构造函数的地方都可以完全等价地用{}代替】,都是直接用括号内的值调用对应构造函数直接初始化对象,并不会先生成临时对象再拷贝

    • ={}与{}是等价的语法【即加不加=对初始化行为没有影响】,均不会调用拷贝运算符或拷贝构造函数

    • 与内置类型的列表初始化一致,C++11的列表初始化只能用于初始化,不能用于已初始化对象的赋值

    • 实际机制猜想:传递的实际参数为initializer_list类型,通过匹配重载函数实现调用【我不知道怎么验证这个过程,求大佬解答】

    列表初始化用于函数返回值

    • 在返回值类型为对象(不能是对象的引用)的函数中可以返回{}的列表初始化

    • {}返回值的实际类型为initiallizer list(但不能声明为std::initializer_list),相当于返回构造函数的表达式,因此类型不能是对象的引用

    引入std::initializer_list

    • initializer_list为一个轻量级STL模板,声明在头文件<initializer_list>中,定义在命名空间std中

    • 任意的STL容器都与未指定长度的数组有一样的初始化能力,可以填入任何数量的同类型数据,因此可以用STL容器轻易对固定类型的类进行赋值

    • initializer_list是一个轻量级的模板,可以接受任意长度的同类型的数据也就是接受可变长参数,同时作为STL容器它具有STL容器的共同特征(如迭代器)

      • 只有三个成员接口:begin() end() size()

      • 只能被整体的初始化和赋值,迭代器遍历的数据仅可读,不能对单个数据进行修改

    • 所有{}对象都是隐式创建的std::initializer_list类型字面量(右值),广泛用于实现列表初始化(不需要头文件)

    代码验证

    class testClass{private:int a;int b;public:testClass() :a(0), b(0) {cout << "default init\n";}testClass(int a) :a(a), b(a) {cout << "sing-val init\n";}testClass(int a, int b) :a(a), b(b) {cout << "val init\n";}testClass(testClass& temp) :a(temp.a), b(temp.b) {cout << "copy init\n";}testClass& operator=(testClass& temp) {//testClass& newobj = *this;a = temp.a;b = temp.b;cout << "copy assign\n";return *this;}testClass& operator=(int x) {a = x;b = x;cout << "int-convert assign\n";//testClass& newobj = *this;return *this;}testClass& operator++() {a++;b++;}void printVal(ostream& os) {os << "a=" << a << "\n";os << "b=" << b << "\n";}};using tc = testClass;tc& makeObj(int x, int y){return { x,y };}int main(){tc a(1, 1); //val inittc b{ 1,1 }; //val inittc c = { 1,1 }; //val inittc d = tc{ 1,1 }; //val initcout << endl;tc* e = new tc[2]; //default init *2cout << endl;tc* f = new tc[3]{ {1,1},{2,2},{3,3} }; //val init *3cout << endl;tc* g = new tc[5]{ {1,1},{1} }; // val init + sing-val init + default init *3cout << endl;cout << "testing return val of init_list\n";tc h = makeObj(2, 2); //val inittc i = h; //copy initi = d; //copy assigni.printVal(cout);return 0;}

    列表初始化测试

    添加initializer_list为参数的构造函数后

    testClass::testClass(initializer_list<int> list) :a(0), b(0){int ab = 1;for (auto it = list.begin(); it != list.end(); it++){if (ab)a += *it;elseb += *it;}cout << "init_list init\n";} int main(){tc a(1, 1); //val inittc b{ 1,1 }; //val inittc c = { 1,1 }; //val inittc d = tc{ 1,1 }; //val initcout << endl;tc* e = new tc[2]; //default init *2cout << endl;tc* f = new tc[3]{ {1,1},{2,2},{3,3} }; //val init *3cout << endl;tc* g = new tc[5]{ {1,1},{1} }; // val init + sing-val init + default init *3cout << endl;cout << "testing return val of init_list\n";tc h = makeObj(2, 2); //val inittc i = h; //copy initi = d; //copy assigni.printVal(cout);cout << endl;cout << "testing argument init_list\n";tc j = { 1,2,3,4,5,6 };tc k = { 9 };return 0;}

    以下为运行截图

    C++11中列表初始化机制的概念是什么添加init_list后测试截图

    由此可见所有列表初始化都调用了含有initializer_list为参数的构造函数,证实了列表初始化是基于隐式转换并以initializer_list为底层实现的构想

    应用

    • 在声明时直接初始化堆上分配的对象(数组)

      • 类:可以显式指定使用的构造函数(默认会执行无参数的构造函数)

      • 内置类型:可以在分配时直接指定值

    • 在函数返回对象时避免自动存储期对象销毁的问题

    • 手动调用std::initializer_list实现可变参数初始化

    列表初始化防止类型收窄

    C++11的列表初始化还有一个额外的功能就是可以防止类型收窄,也就是C++98/03中的隐式类型转换,将范围大的转换为范围小的表示,在C++98/03中类型收窄并不会编译出错,而在C++11中,使用列表初始化的类型收窄编译将会报错:

    int a = 1.1; //OKint b{ 1.1 }; //error float f1 = 1e40; //OKfloat f2{ 1e40 }; //error const int x = 1024, y = 1;char c = x; //OKchar d{ x };//errorchar e = y;//errorchar f{ y };//error

    “C++11中列表初始化机制的概念是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: C++11中列表初始化机制的概念是什么

    本文链接: https://www.lsjlt.com/news/305213.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++11中列表初始化机制的概念是什么
      本篇内容介绍了“C++11中列表初始化机制的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!概述定义:列表初始化是C++11引入的新...
      99+
      2023-06-25
    • C++11中列表初始化机制的概念与实例详解
      目录概述 实现机制详解 POD类型的列表初始化 含有构造函数的类的列表初始化(C++11) 列表初始化用于函数返回值 引入std::initializer_list 代码验证 应用 ...
      99+
      2022-11-12
    • C++11列表初始化是怎样的
      这篇文章主要介绍“C++11列表初始化是怎样的”,在日常操作中,相信很多人在C++11列表初始化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11列表初始化是怎样的”的疑惑有所帮助!接下来,请跟...
      99+
      2023-06-19
    • C++11关联容器的列表怎么初始化
      本篇内容介绍了“C++11关联容器的列表怎么初始化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是关联容器关联容器(associativ...
      99+
      2023-06-19
    • C++11中初始化列表initializer lists的使用方法
      C++11引入了初始化列表来初始化变量和对象。自定义类型,如果想用初始化列表就要包含initializer_list头文件。 C++11将使用大括号的初始化(列表初始化)作为一种通用...
      99+
      2022-11-12
    • C++是怎么构造函数的初始化列表
      C++是怎么构造函数的初始化列表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.问题class A {private:int m_a;publi...
      99+
      2023-06-22
    • C++11新特性中如何进行列表初始化的具体使用
      这篇文章给大家介绍C++11新特性中如何进行列表初始化的具体使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们...
      99+
      2023-06-29
    • jquery中序列化的概念是什么
      本篇内容介绍了“jquery中序列化的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在jquery中,序列化是指把对象转化为可传输...
      99+
      2023-07-05
    • C语言异常处理机制的概念是什么
      这篇“C语言异常处理机制的概念是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言异常处理机制的概念是什么”文章吧。异...
      99+
      2023-06-17
    • C#中的变量初始化形式是什么
      本篇内容主要讲解“C#中的变量初始化形式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的变量初始化形式是什么”吧!C# 中的变量初始化变量通过在等号后跟一个常量表达式进行初始化(赋值...
      99+
      2023-06-17
    • C++中初始化和赋值的区别是什么
      这篇文章给大家介绍C++中初始化和赋值的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对于基本数据类型差别不大:比如:int a = 12; // initi...
      99+
      2023-06-17
    • 微信小程序中控制器的初始化逻辑是什么
      微信小程序中控制器的初始化逻辑是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面介绍微信小程序的控制器index.js的实现, 即MVC设计理念的C-Controller...
      99+
      2023-06-05
    • MongoDB的初始化步骤有哪些以及其缓存刷新机制是什么
      MongoDB的初始化步骤有哪些以及其缓存刷新机制是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  当内存用尽开始往磁盘上刷脏页的时...
      99+
      2022-10-18
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作