有时我们无法提前知道应该向函数传递几个实参。为了编写能处理不同数量实参的函数我们使用initializer_list
C++plusplus中的定义:
其里面有三个成员函数
也就是说他是支持迭代器的,支持迭代器就支持范围for
图像理解
函数类型
void Test1_initializer_list(initializer_list<int> list)
{for (auto ll : list){cout << ll<<" ";}cout << endl;
}template<class T>
void Test2_initializer_list(initializer_list<T> list)
{for (auto ll : list){cout << ll<<" ";}cout << endl;
}
模板类型
template<class T>
struct Test3_initializer_list
{Test3_initializer_list(initializer_list<T> lt){//本步骤只用来观察T arr[3] = { 0 };//获取数值后方便给内部变量int i = 0;//下标次数for (auto ll : lt){if (i < 3) {arr[i] = ll;i++;}else break;}_a = arr[0];_b = arr[1];_c = arr[2];}void Print(){cout << _a << " " << _b << " " << _c << endl;}
private:T _a;T _b;T _c;//最好是vector<T> _arr;接收,initializer_list传过来多少就能赋值多少
};
验证列表是否为const修饰
template<class T>
struct Test4_initializer_list
{Test4_initializer_list(initializer_list<T> lt){for (auto& ll : lt) {ll += 1;cout << ll << " ";}}
private:vector<T> _arr;
};
此时会报错
同时如果我们测试
const int a = 1;
a += 1;
也一样会报错
对比发现这里的a和ll都是由于被const修饰,让他们变成了常变量而无法修改,所以的已验证initializer_list对象被const修饰
对应相关测试程序
//使用initializer_list打包一串初始化列表内容initializer_list<int> list = { 1,2,3,4,5,6,7,8 };Test1_initializer_list(list);Test2_initializer_list({ 1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8 });Test3_initializer_list<int> til1 = { 1,2,3,4,5,6,7,8 };til1.Print();//以下内容均报错//Test4_initializer_list<int> til2 = { 1,2,3,4,5,6,7,8 };//const int a = 1;//a += 1;