C++11 列表初始化、initializer_list、auto、decltype、array

2024-04-17 18:20

本文主要是介绍C++11 列表初始化、initializer_list、auto、decltype、array,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

列表初始化

对象初始化

数组初始化

自定义类型初始化

嵌套式初始化

new表达式初始化

initializer_list

auto

使用 auto 关键字可以让编译器自动推导变量的类型

在使用容器的迭代器时,可以使用 auto 简化类型声明

auto 也可以用于推导比较复杂的类型

使用auto遍历

遍历数组

遍历vector

decltype

获取变量类型

获取表达式类型

获取函数值返回类型

decltype 会保留表达式中的引用类型

array


列表初始化

在C++11中,引入了一种称为列表初始化(List Initialization)的新特性,它提供了一种统一的初始化语法,可以用于各种初始化操作,包括对象、数组、结构体等。列表初始化使用花括号 {} 来构造初始化列表。

下面是列表初始化的几种常见用法:

对象初始化
int x{5}; // 初始化整数变量 x 为 5
int x={5};//也可以这样
std::string str{"Hello"}; // 初始化字符串对象为 "Hello"
std::string str={"Hello"};
数组初始化
int arr[]{1, 2, 3, 4, 5}; // 初始化整型数组
std::vector<int> vec{1, 2, 3}; // 初始化整型向量
自定义类型初始化
struct Point {int x;int y;
};Point p{3, 4}; // 初始化 Point 结构体对象
嵌套式初始化
std::vector<std::vector<int>> matrix{{1, 2}, {3, 4}, {5, 6}}; // 初始化二维向量
new表达式初始化
    vector<int>* p1=new vector<int>(2);//new原来初始化的方式vector<int>* p2=new vector<int>{2};

列表初始化的优点之一是它具有更加严格的类型检查,可以避免一些隐式类型转换导致的问题。此外,它也可以用于在声明时进行初始化,提高了代码的可读性和简洁性。

initializer_list

initializer_list 是C++11引入的一种特殊类型,它可以用来初始化类的成员变量或函数的参数列表。它本质上是一个包含了指定数量元素的数组,但它与普通的数组不同之处在于,它可以作为函数参数传递,而且可以自动推断元素的类型。

int main()
{
auto il = { 10, 20, 30 };
cout << typeid(il).name() << endl;
return 0;
}vector<int> v1{1,2,3};//{1,2,3}会被编译器识别为initializer_list类型,然后通过vector构造函数去初始化v1
map<string,string> map1{{"sort","排序"},{"left","左边"}};

auto

auto 是一种类型推导关键字,它允许编译器自动推导变量的类型。使用 auto 声明的变量的类型会根据其初始化表达式的类型来推导

使用 auto 关键字可以让编译器自动推导变量的类型
auto x = 5; // 推导为 int 类型
auto y = 3.14; // 推导为 double 类型
auto ptr = new MyClass(); // 推导为指向 MyClass 类型的指针
在使用容器的迭代器时,可以使用 auto 简化类型声明
std::vector<int> v1 = {1, 2, 3, 4, 5};
auto it=v1.begin()//auto自动推导类型,这里的类型是std::vector<int>::iterator
auto 也可以用于推导比较复杂的类型
auto lambda = [](int x, int y) { return x + y; }; // 推导 lambda 表达式类型
使用auto遍历
遍历数组
int a[]={9,0,1};
for(auto e:a)
{cout<<e<<endl;
}
遍历vector
    vector<int> v4(1,23);for(auto e:v4){cout<<e<<endl;}

auto除了可以遍历数组,还可以遍历c++中的容器(只要容器有迭代器,我们就可以遍历,我们自定义的类型,如果迭代器,也可以用auto遍历)

decltype

decltype 是 C++11 中的一个关键字,用于获取表达式的类型,而不实际计算该表达式的值。它可以用于获取变量、表达式或函数返回值的类型,而无需显式指定类型

decltype使用语法

decltype(expression)

其中 expression 是要获取类型的表达式或变量。


 

获取变量类型
int x = 5;
decltype(x) y; // 推导出变量 x 的类型,即 int
获取表达式类型
int x = 5;
double y = 3.14;
decltype(x + y) result; // 推导出表达式 x + y 的类型,即 double
获取函数值返回类型
int add(int a, int b) {return a + b;
}
decltype(add(1, 2)) sum; // 推导出函数 add 的返回值类型,即 int
decltype 会保留表达式中的引用类型
int x = 5;
int& ref = x;
decltype(ref) z = x; // 推导出变量 ref 的类型,即 int&

array

在C++中,std::array 是一个标准库容器,表示固定大小的数组。与传统的C数组相比,std::array 提供了更多的功能和安全性,例如可以通过成员函数获取数组的大小,支持迭代器和范围循环,以及提供了一些操作数组的成员函数。

array的新增使用来弥补C语言数组不足的,例如

array<int,5> a1;//array类型
int a2[5];//数组a1[5]会报错
a2[5]不会报错

array相较于vector于就显得多余了,vector功能更加的强大

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

这篇关于C++11 列表初始化、initializer_list、auto、decltype、array的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912500

相关文章

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL