• C++11的初始化列表


      初始化是一个非常重要的语言特性,最常见的就是对对象进行初始化。在传统 C++ 中,不同的对象有着不同的初始化方法,例如普通数组、POD (plain old data,没有构造、析构和虚函数的类或结构体)类型都可以使用 {} 进行初始化,也就是我们所说的初始化列表。而对于类对象的初始化,要么需要通过拷贝构造、要么就需要使用 () 进行。这些不同方法都针对各自对象。在传统C++中可以使用初始化列表如下:

    #include<bits/stdc++.h>
    using namespace std;
    
    class A{
    public:
    	int a, b, c;
    };
    int main(){
    	int arr[4] = {1, 2 ,3 ,4};  // 数组初始化
    	A a = A{1,2,3};	   // 传统类列表初始化
    	return 0;
    }
    

    为了解决这个问题,C++11 首先把初始化列表的概念绑定到了类型上,并将其称之为 initializer_list,允许构造函数或其他函数像参数一样使用初始化列表,这就为类对象的初始化与普通数组和 POD 的初始化方法提供了统一的桥梁。可以缉拿个类模板initializer_list作为构造函数的参数,则初始化列表就智能用于构造该函数。值得注意的是列表中的元素必须是5同一种类型或者可以转化为同一种类型。STL中提供了initializer_list作为参数构造函数,考虑vector的下列实例:

    vector<int> a1(10);         // 定义了大小为10未初始化的int型向量
    vector<int> a2{10};        // 使用initializer-list初始化,a2只有一个元素初始化为10
    vector<int> a3{1, 2, 3};  // 使用initializer-list初始化,a3有三个元素1,2,3
    

    偷文件initializer_list提供了对类模板initializer_list的支持。该类中包含成员函数begin()和end()可以获得列表范围。除了用于构造函数外,initilazer_list还可以作为常规函数的参数。下面编写一个函数sum来求和,演示该模板类作为函数参数的使用。

    #include<iostream>
    #include<initializer_list>
    using namespace std;
    
    double sum(initializer_list<double> L){
    	double tol = 0.0;
    	for(auto p = L.begin(); p != L.end(); p++){
    		tol += *p;
    	}
    	return tol;
    }
    
    int main(){
    	double tol = sum({1.0, 2, 3, 4.5});
    	cout << tol <<endl;
    	return 0;
    }
    
  • 相关阅读:
    windows常用命令行总结
    express安装
    MySQL去除外键关联关系
    c#实体转化
    C#之Clone
    mysql 将null转代为0(转)
    Mysql显示行号
    mysql存储过程游标加计划任务事件调度器
    mysql临时表
    Git学习笔记
  • 原文地址:https://www.cnblogs.com/td15980891505/p/7418342.html
Copyright © 2020-2023  润新知