Variadic TempLates(数量不定的模板参数): ...(可以很方便的完成函数递归调用)
...就是一个所谓的pack;
用于模板参数,就是模板参数包;
用于函数参数类型,就是函数参数类型包;
用于函数参数,就是函数参数包。
注意:要特别处理承参数为0个的情况
sizeof...(args):参数个数
void print(){ } template <typename T, typename...Types> void print(const T& firstArg,const Types&... args){ }
模板表达式中的空格:
c++11后空格有无都无所谓,c++11前必须要有。
nullptr和std::nullptr_t:
c++11允许使用nullptr替代0或者NULL作为无值指针的结果,这种新特性避免了null指针被解释为整形值的错误发生。
nullptr是一个关键字,包含了nullptr_t.
auto:
c++11中允许使用auto声明一个不用指出具体类型的变量或者对象,编译器自己会做实参推导,在类型特别长和复杂的时候特别有用,简单类型的不建议用,因为耗时较长。
一致性初始化:
C++11引入了一致性初始化(Uniform Initialization)的新特性,这个特性允许你使用一种统一的语法来初始化各种不同类型的变量,包括基本数据类型、类对象、数组等。一致性初始化的目标是简化和统一初始化的语法,提高代码的可读性和可维护性。
- 使用大括号
{}
进行初始化:
int x{42}; // 初始化整数 std::string name{"John"}; // 初始化字符串 std::vector<int> numbers{1, 2, 3}; // 初始化容器 int i{};//初始化为0 int* q{};//初始化为nullptr;
- 使用圆括号
()
进行初始化:
int y(24); // 使用圆括号初始化整数 std::vector<double> data(10, 0.0); // 使用圆括号初始化容器
- 使用等号
=
进行初始化:
int z = 17; // 使用等号初始化整数 double pi = 3.14159; // 使用等号初始化浮点数
initializer_list:
C++中的initializer_list
是一个用于传递初始化值列表的特性,它在C++11引入,并被广泛用于初始化容器、自定义类的对象和其他支持初始化列表的场合。initializer_list
允许你以一种类似于数组的方式传递一组值,并可以在接收这些值的函数或构造函数中使用。以下是initializer_list
的主要特性和用法:
- 完整代码样例:
#include<iostream> class MyVector { public: MyVector(std::initializer_list<int> values) { data_ = new int[values.size()]; size_ = values.size(); int i = 0; for (int num : values) { data_[i++] = num; } } void show(){ for(int i = 0 ;i<size_;++i){ std::cout<<data_[i]<<", "; } std::cout<<std::endl; } // 其他成员函数... private: int* data_; size_t size_; }; void printNumbers(std::initializer_list<int> numbers) { for (int num : numbers) { std::cout << num << " "; } std::cout << std::endl; } int main(){ std::cout<<"hello world"<<std::endl; std::initializer_list<int> numbers = {1, 2, 3, 4, 5}; std::cout << std::endl; // 调用函数并传递初始化列表 printNumbers({1,2,3,4}); for (int num : {1, 2, 3, 4, 5}) { std::cout << num << " "; } std::cout << std::endl; // 使用initializer_list来创建MyVector对象 MyVector vec = {1, 2, 3, 4, 5}; vec.show(); }
- 初始化列表的语法:
使用大括号 {}
包围一组值,逗号分隔这些值,创建一个initializer_list
对象。
std::initializer_list<int> numbers = {1, 2, 3, 4, 5};
- 用途:
- 传递不定数量的参数给函数。
- 初始化STL容器,如
std::vector
、std::initializer_list
等。 - 自定义类的构造函数参数,用于初始化对象的成员。
- 使用范围
for
循环遍历初始化列表中的元素
- 传值给函数:
initializer_list
常常用于传递一组值给函数,允许函数接收不定数量的参数。例如
void printNumbers(std::initializer_list<int> numbers) { for (int num : numbers) { std::cout << num << " "; } std::cout << std::endl; } // 调用函数并传递初始化列表 printNumbers({1, 2, 3, 4, 5});
- 使用for循环
initializer_list
通常与范围for
循环一起使用,以便轻松地遍历其中的元素。
for (int num : {1, 2, 3, 4, 5}) { std::cout << num << " "; } std::cout << std::endl;
- 自定义类型构造函数参数
可以在自定义类中使用initializer_list
构造函数来接收初始化列表,并以其为对象的成员进行初始化。
#include<iostream> class MyVector { public: MyVector(std::initializer_list<int> values) { data_ = new int[values.size()]; size_ = values.size(); int i = 0; for (int num : values) { data_[i++] = num; } } void show(){ for(int i = 0 ;i<size_;++i){ std::cout<<data_[i]<<", "; } std::cout<<std::endl; } // 其他成员函数... private: int* data_; size_t size_; }; void printNumbers(std::initializer_list<int> numbers) { for (int num : numbers) { std::cout << num << " "; } std::cout << std::endl; } int main(){ std::cout<<"hello world"<<std::endl; std::initializer_list<int> numbers = {1, 2, 3, 4, 5}; std::cout << std::endl; // 调用函数并传递初始化列表 printNumbers({1,2,3,4}); for (int num : {1, 2, 3, 4, 5}) { std::cout << num << " "; } std::cout << std::endl; // 使用initializer_list来创建MyVector对象 MyVector vec = {1, 2, 3, 4, 5}; vec.show(); }