首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《C++11》各种初始化方式的详细列举与对比

本文将详细列举 C++ 中的各种初始化方式,并对它们进行对比,帮助开发者更好地理解和应用这些特性。1....STL 容器2.5 统一初始化(Uniform Initialization)C++11 引入的统一初始化方式,使用大括号 {},可以用于所有类型的对象。...4.1 防止窄化转换定义窄化转换(Narrowing Conversion)是指将一个较大范围的类型转换为一个较小范围的类型,这种转换可能会导致数据丢失。...可读性:使得类的默认状态更加明确,便于理解。4.3 命名初始化定义命名初始化(Named Initialization)是指在初始化结构体或类时,可以为成员指定名称。...灵活性:可以在初始化时只指定部分成员,未指定的成员会使用默认值。注意在 C++11 中,虽然没有直接的命名初始化语法,但可以通过构造函数或其他方式实现类似的效果。5.

5800

C++17中新特性

但是,C++11中的auto推导,往往结果与预期的不同。 c++11 中为了支持统一初始化,引入了新的统一初始化语法,如下所示。...,值不存在时则抛出 std::bad_optional_access 异常 value_or() // 值存在时返回值,不存在时返回默认值 3. std::any 一个类型安全的可以保存任何值的容器...4. std::string_view string_view我最早使用的是boost版本的,c++17中的string_view 和 boost类似。...string_view可以理解成原始字符串一个只读引用。 string_view 本身没有申请额外的内存来存储原始字符串的data, 仅仅保存了原始字符串地址和长度等信息。...bool 表达式不能用 ++, -- 这两个自增(减)运算符了 c++17中异常已经成为了类型系统的一部分, 枚举的直接列表初始化 结构化绑定 constexpr if 表达式 map支持merge和extract

4.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    列表初始化:轻量级对象initializer_list

    该章节将结合具体代码,深入讲解C++11中的列表初始化,与C++98进行对比,更清晰地理解这些概念。...C++98中的初始化方式 在C++98中,数组和聚合类型(如结构体)可以使用大括号{}进行初始化,但基本类型和自定义类对象通常不能直接使用{}初始化,需要使用构造函数或赋值操作。...return 0; } C++11中的列表初始化 C++11引入了列表初始化,使得几乎所有类型的对象都可以使用{}进行初始化,包括基本类型和自定义类对象。...,C++11引入了std::initializer_list,提供了一种统一的方式来初始化容器和自定义类型。..._length:表示元素的数量。 特性 只读容器:std::initializer_list是一个轻量级的只读容器,不能修改其中的元素。 自动推导类型:可以通过auto关键字自动推导类型。

    28710

    【C++】C++11常用特性总结

    一、统一的列表初始化 1.统一的{}初始化 1....然而在C++11中,扩大了{}列表初始化的范围,使其能够初始化所有的自定义类型和内置类型,实现统一的列表初始化{},并且在初始化的时候,如果不想写=赋值符号,也可以将其省略,只保留{}花括号列表。...列表初始化当然也可以用在new开空间的时候,例如p2指针指向空间在开辟的时候,内部元素被初始化为0,p3结构体指针指向的结构体数组也可以用统一的列表进行初始化。...* t2的结果类型定义出一个变量ret,但我们不清楚t1和t2是什么类型,我们不能单独用t1或t2类型定义出变量ret。...//但其实array也没啥用,虽然比C语言的普通数组多了越界的检查,但既然我已经有了vector,那为什么还要用你的array呢? //我的vector的operator[]也可以检查越界啊!

    82140

    【笔记】《深入理解C++11》(上)

    0 绪 本篇是看完《深入理解C++11:C++11新特性解析与应用》后做的笔记的上半部分....理解这个初衷就能理解C++11很多新内容的设计缘由 核心改进点: 并行编程: 内存模型, 线程, 原子操作 泛型编程: 统一初始化表达式, auto, decltype, move 系统编程: constexpr...regex, 库尽量以头文件实现, 但也有并行库这种必须深入编译器的库 用通用而非特殊的手段来实现特性: 显式类型转换 让特性对专家和新手都适用: 统一初始化表达式 增强类型安全: enum class...新手易学, 老兵易用 auto auto是静态类型推导, 必须被初始化 auto本质上是一个类型占位符, 在编译的时候推导出类型然后以类似字面替换的方式进行使用 auto和cv限制符(cv-qualifier...auto的类型推导式从左到右进行的, 由于类似字符替换的特性, 表达式auto t = 1, &r = t, *p = &r;是合法的 auto不能作为形参的类型, 需要泛型的时候还是应该用模板处理

    2K20

    【C++】C++11的新特性 --- 列表初始化,auto关键字,decltype关键字

    接下来我将通过几篇文章来介绍一下C++11中重要的特性! 2 列表初始化 在C++11中加入了initializer_list标准库类型,用于表示某种特定类型的数组。...Point p = { 2 , 33 }; return 0; } 这里是多参数的隐式类型转换,类似之前的单参数的隐式类型转化。...不能用来声明对象 decltype:是用来声明变量,他可以推断变量类型并可以用来声明 std::mapstd::string, std::string>::const_iterator it1 = dict.begin...如果auto调用了多层,就很难确定一个变量的类型,让代码的可读性变得很差!让代码的维护变得更加困难!所以使用中要谨慎使用!!!...4 STL中的新容器 4.1 array 这是一个静态数组,可以在初始化中就确定数组大小,对越界的检查比int arr[]更加严格。但是其在实际使用中并不实用,因为vector完全可以替代!

    11010

    【C++11】C++11新纪元:深入探索右值引用与移动语义

    统一的列表初始化 在C++11及以后的版本中,引入了统一的列表初始化(Uniform Initialization)或称为初始化列表(Initialization List),这是一种新的初始化语法,...统一的列表初始化不仅提高了代码的一致性和可读性,还解决了之前初始化语法中的一些歧义和限制 { }初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定 代码示例 (...std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加 std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了...新容器 array 在C++中,std::array 是一个固定大小的容器,它提供了类似于数组的接口,但它是标准库的一部分,因此提供了更多的安全性和灵活性。...你实际上是在告诉编译器:“这个对象我之后可能不再需要了,或者我可以接受它处于某种未定义状态,所以你可以安全地‘窃取’它的资源。”

    10810

    深入理解C++11右值引用与移动语义:高效编程的基石

    新容器:如 std::unordered_map 和 std::array 等,丰富了 C++ 的数据结构。 范围 for 循环:更简洁的循环语法,便于遍历容器。...二、统一的列表初始化 在 C++11 中,列表初始化(List Initialization)是一种新的初始化方式,它允许使用花括号 {} 来初始化变量和对象。...return 0; } 2.3 类构造函数中的列表初始化 C++11 引入了 std::initializer_list,使得可以通过列表初始化构造类对象。...return 0; } 在这个例子中,MyClass 接受一个 std::initializer_list 类型的参数,可以在初始化时传入多个值。...2.4 列表初始化防止隐式窄化转换 列表初始化可以防止某些类型转换错误(例如浮点数到整数的窄化转换),从而提高代码的安全性。C++11 标准规定,列表初始化不允许隐式的窄化转换。

    12910

    【C++高阶】:C++11的深度解析上

    统一的列表初始化 1.1 { }初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...C++11中废弃auto原来的用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。...右值引用是C++11引入的一种新类型的引用,它通过类型后加&&来表示。右值引用可以绑定到右值上,但也可以绑定到左值上(需要std::move来显式转换)。...给右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址(可以理解为对右值取别名之后,这个别名就变为了左值),也就是说例如:不能取字面量10的地址,但是rr1引用后,可以对rr1取地址,也可以修改...,那为什么C++11还要提出右值引 用呢?

    7110

    【C++11】入门基础

    ✨C++11文档介绍,点击跳转 2. 统一的列表初始化 2.1{}初始化   在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...它是C++11引入的,它的主要目的是在不使用显式构造函数的情况下,实现统一的初始化语法。...std::initializer_list类型 std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数...std::initializer_list是一个标准库类型,在C++11中引入。它是一个模板类,用于在不使用显式构造函数的情况下,以统一的方式初始化容器或其他对象。 3....;原则上讲,exp只是一个普通的表达式,它可以是任意复杂的形式,但必须保证exp的结果是有类型的,不能是void;如exp为一个返回值为void的函数时,exp的结果也是void类型,此时会导致编译错误

    6310

    【C++】语法简化和增强,C++11都做了什么?

    1、统一的列表初始化 C++11支持一切皆可列表初始化。...在C++98中我们可以对数组和结构体用{}进行初始化,C++11扩大了{}的使用范围,使其可以对所有内置类型和自定义类型初始化,可是说是统一了列表的初始化方式。其中初始化列表时,=是可以省略的。...容器{}初始化可以有任意多个参数 1.2 std::initializer_list std::initializer_list是C++11引入的一种特殊类型,它提供了一种简洁、直观的方式来初始化容器或数组...则是一个模板类,用于接收这些值 联系: 当使用列表初始化语法时,编译器会生成一个std::initializer_list对象来存储初始化列表中的元素 类的构造函数可以重载以接受一个std::initializer_list...是一个特殊的关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其他类型的指针类型,使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型

    7610

    Google C++ 编程风格指南(五):其他 C++ 特性

    要高效率地使用某些标准库类型, 例如 std::unique_ptr, std::move 是必需的. 缺点: 右值引用是一个相对比较新的特性 (由 C++11 引入), 它尚未被广泛理解....一旦在类层级中加入新的子类, 像这样的代码往往会崩溃. 而且, 一旦某个子类的属性改变了, 你很难找到并修改所有受影响的代码块. 不要去手工实现一个类似 RTTI 的方案....编译器可以更好地进行类型检测, 相应地, 也能生成更好的代码. 人们对编写正确的代码更加自信, 因为他们知道所调用的函数被限定了能或不能修改变量值....优点: 保持声明统一. 缺点: C++ 中整型大小因编译器和体系结构的不同而不同....定义: C++11 中,若变量被声明成 auto, 那它的类型就会被自动匹配成初始化表达式的类型。您可以用 auto 来复制初始化或绑定引用。

    1.2K30

    C++11学习笔记1

    前言 很久以前就知道C++11对我们课上讲的C++有很多改进的地方,当时也没有细学,最近一个偶然的机会陡然发现原来身边的同学好多都对C++11都颇有心得,推崇备至,回头想想在C++14,甚至C++17都不新鲜的现在...于是呢我就打算利用最近闲着的时间,在补《人民的名义》的间隙顺便学学C++11应该也是极好的。...用法 我们可以用auto声明其他的变量,但是需要注意下面几点: auto 声明的变量必须在编译阶段就能识别类型。 auto 不能声明非静态成员变量。 auto 不能用来声明函数参数。...在C++11里引入了基于范围的for循环,它可以支持迭代任何容器、数组、初始化列表等类型。...::cout<< ite.first ; std::cout<< ite.second ; } 同时,这个迭代变量还可以声明成引用类型,也就是说我们可以通过他对原数组进行修改: #include

    33210

    大一大二的计算机专业同学应该学习什么?如何学习?

    当然,指针一直是很多初学者的老大难,可以把指针作为一个专题彻底搞明白,关于这方面也有一本非常好的书,这本书的语言写的也非常通俗易懂,我当年读完之后,对指针再无疑惑,书名叫《C和指针》。...,要熟悉新标准常用的语法与新功能,包括:另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下: 左值/右值/std::move/std::forward 统一的类成员初始化语法与...智能指针类 std::bind/std::function C++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书...学习算法和数据一定不能急功近利,算法和数据结构的知识一定要作为一个长期的学习目标。...与 C 语言相关的算法和数据结构的书有: 《数据结构与算法分析—C语言描述》 当然,如果你觉得这块很难理解,可以先通过一些轻松点的书入门以建立一些感官认识,推荐《大话数据结构》这本书。

    85760

    【C++修炼之路】26.C++11(语法糖)

    C++11 C++11(语法糖) 本节目标 一.C++11简介 二.统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 三.声明 3.1 auto 3.2 decltype...二.统一的列表初始化 2.1 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。...是作为常量区的一个封装的类型,通过查阅文档,其也有迭代器,可以将常量区的元素一一遍历。...也可以作为operator=的参数,这样就可以用大括号赋值。因此我们就知道了为什么vector类的空间是如何初始化的,vector的构造函数就存在std::initializer_list的参数。...那再来回顾一下当初模拟实现的vector,由于我们并没有设置std::initializer_list的构造,因此采用大括号进行初始化是错误的,所以我们可以多重载一个由std::initializer_list

    44000

    写算法,用 C++ 还是用 Java ,差别大吗?

    大部分情况下,两种语言的基本数据类型可以根据下表进行一对一的转换,但是也有差异,需要特别注意。...字符串 很多 C++ 程序员喜欢的用 char* 或 char 类型的数组存储字符串,这其实是 C 语言用户带过来的习惯,我给出的 C++ 算法实现对字符串一般都用 std::string,对应 Java...C++11 版本引入了一种根据范围循环的语法,一般理解和 Java 的增强 for 循环类似,比如这种 C++ 循环形式: ? Java 与之对应的形式是: ?...C++ 没有抽象基类的语法,但是又抽象基类的概念,一般当一个类中有一个纯虚函数的时候,这个类是不能被直接实例化的,它就类似于是一个抽象基类,比如: ?...C++ 的函数有很多类型修饰,比如常见的 const,C++11 后新增了 final 和 override,但是 = 0 一直是一个比较奇怪的存在,它表明这个函数没有实现,需要在派生类中实现,同时,也说明这个类是不能被实例化的

    2.8K20

    C++11基础学习系列一

    我觉得原因有如下(不要劈我,仅此个人意见): C++是对C语言进行了抽象同时又支持了很多面向对象的特性,在趋于底层设计时又对上层进行封装和扩展。...废话不说了,我写一系列的C++(c++11)文章,主要是记录自己学习、看书和遇到问题的总结。好记性不如烂笔头。 类型 “千里之行始于足下”。...两者都间接提供了访问对象的功能,其中C++11提供字面值nullptr来初始化指针。void * 可以存放任意对象地址....,所以不能被定义为constexpr,而算术类型、引用和指针都属于字面值类型所以可以定义为constexpr,但是constexpr指针必须是nullptr或者固定地址中的对象,并且constexpr仅对指针有效...对于const的引用,引用类型必须与其所引用对象的类型保持一致,当然在初始化变量时可以使用常量表达式作为初始值: #include int main() { int a

    93040

    【Modern C++】深入理解左值、右值

    你好,我是雨乐!...作为多年的C++开发人员,一直以来,对左值右值的理解没有一个系统的认识,总感觉似懂非懂。...自C++11开始,对值类别又进行了详细分类,在原有左值的基础上增加了纯右值和消亡值,并对以上三种类型通过是否具名(identity)和可移动(moveable),又增加了glvalue和rvalue两种组合类型...rvalue不能放在赋值或者组合赋值符号的左边,例如:3 = 5,3 += 5,这些表达式没有意义,也编译不过。 rvalue可以用来初始化const左值引用(见下文)。...深入 经过前面的内容,我们对左值和右值(纯右值和将亡值)有了一个初步的认识,在本节,我们借助一些例子,来加深对左值和右值的理解。

    1K21

    【c++11】列表初始化与声明

    个人主页:Quitecoder 专栏:c++笔记仓 相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从...标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定: struct Point { int _x; int _y; }; int main() { int array1[] = {...std::initializer_list 是 C++11 引入的一个标准库类模板,用于支持统一的列表初始化语法,并简化初始化列表的处理。...注意事项 不可修改内容:std::initializer_list 中的内容是常量,不能被修改。 只能用于固定大小的初始化:如果需要动态大小的数据结构,应使用其他容器(如 std::vector)。...它的能力远超 auto,可以精确地获取表达式的类型,尤其适合处理复杂类型和左值/右值差异的场景。 1. 定义与作用 decltype 的功能是检查一个表达式的类型,并返回该类型。

    13810
    领券