C++11初始化列表用法-创新互联
                                            初始化列表

- 在C++98时,若想使用花括号“{}”对数组元素进行初始化,只能进行形如:
int arr[5] = {0}; 
int arr[] = {1, 2, 3, 4} ;但一些自定义类型(包括标准库中形如vector这样的容器)是不被允许的,在C++11中增加了该功能,这种初始化的方法被称为“初始化列表”
#include#include 从C++11开始,以下几种形式的初始化得到允许:
//“=”加上赋值表达式
int a = 3+4;
//"=" 加上花括号初始化列表
int a = {3+4};
//圆括号的表达式列表
int a(3+4);
//花括号的初始化列表
int a{3+4}- 是否只有内置类型才支持初始化列表?答案是:否,自定义类型也可以
方法:include
#include#includeusing namespace std; 
enum Gender {boy, girl}; 
class People 
{ 
    public:
                //使people类可以通过初始化列表的方式来初始化私有成员data
                //看起来就像是可以放任意数量的pair作为构造函数的参数
        People(initializer_list>l)
        { 
            // initializer_list的构造函数 
            auto i = l.begin(); 
            for (;i != l.end(); ++i) 
            data.push_back(*i); 
        } 
    private: 
        vector>data; 
}; 
People ship2012 = {{"Garfield", boy}, {"HelloKitty", girl}}; 
// 编译选项:g++ -c -std=c++11 3-5-2.cpp     - 进阶用法:重载[]和=来实现批量修改数组中的值
#include#includeusing namespace std; 
class Mydata 
{ 
public: 
    Mydata & operator [] (initializer_listl) 
    { 
        //重载[],将初始化列表的数据写到idex数组中
        for (auto i = l.begin(); i != l.end(); ++i) 
            idx.push_back(*i); 
        //因为Mydata重载了"[]"后,还需要与"="进行重载,故需要return  *this
        return *this; 
    } 
    Mydata & operator = (int v) 
    { 
        if (idx.empty() != true) 
        { 
            //下标指中的位置,
            for (auto i = idx.begin(); i != idx.end(); ++i) 
            { 
                //动态扩容存放数据的d数组,预防index超出d的容量
                d.resize((*i >d.size()) ? *i : d.size()); 
                //在idx所有存放的下标中,作为d的下标,将d中下标为Idx的位置的值改为v
                d[*i -1] = v; 
            } 
                      //本次赋值结束,清空下标
            idx.clear(); 
        } 
        return *this; 
    } 
    void Print() 
    { 
        for (auto i = d.begin(); i != d.end(); ++i) 
            cout<< *i<< " "; cout<< endl; 
    } 
private: 
    vectoridx; // 辅助数组,用于记录index 
    vectord; 
}; 
int main() 
{ 
    Mydata d; 
    d[{2, 3, 5}] = 7; 
    d[{1, 4, 5, 8}] = 4; 
    d.Print(); // 4 7 7 4 4 0 0 4 
} 
// 编译选项:g++ -std=c++11 3-5-4.cpp     - 如果初始化列表作为返回值,通常会构造出临时变量
//将构造临时变量vector{1,3}并返回
vectorFunc() { return {1, 3}; }
//采用const & 作为返回修饰符时,获得的是临时变量的引用,效果与返回一个字面值常量(如return "hello world";)相同
const vector& Func1() { return {3, 5};}   使用列表初始化还有一个大优势是可以防止类型收窄
//todo
2022/12/2 0:30
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:C++11初始化列表用法-创新互联
网页地址:http://www.scyingshan.cn/article/dsicei.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 