这是一个模板函数
- typename后的… 表示’一包‘参数,类型任意。 注意…的位置,语法规定,记住就行
- 只有typename是关键字,Type,arg都是自己命名
- 于是上图的print函数 是递归打印不定个数,不定类型的参数
- 1的定义必须有,不然只有一个参数时,会编译错误
可以并存
蓝框处是调用hash_val函数,调用的函数1。(2和3的第一个参数类型不符合)1在函数内再调用hash_val(),而2更加特化,1更泛化,因此选择调用函数2,2递归调用自己直到arg不够,到3终止,3是种终止条件必须有不断的继承,参数减少,空参数的tuple必须存在,终止条件
vector >以前的空格必须存在,现在不用
自动推导类型
auto i=42;//int double f(); auto d=f();//double
主要用于type很长或者很复杂
vectorUniform Initialization 一致性初始化v; auto it=v.begin();//vector ::iterator auto I=[](int x) ->bool{ //I has type of lambda ... };
初始化时,可以在变量名后加{},进行初始化
在一个变量或者对象后面加{},进行初始化,就是形成了一个Initializer Lists,会关联到一个array
int i;//未初始化
int j{};//j=0
int *p;//未初始化
int *q{};//q=nullptr
int i(5.3);//可以,但是i=5
int i{5.3};//不可以,不可以窄化转化
例子一
接受任意数量的参数,
’一包‘参数
例子二
initializer_list 数据结构
在底层是进行一个浅拷贝,
- 算法中的max(),min()以前只能接受两个参数,现在可以用大括号包起来,任意多的参数
*
- 2.0之前 只能用在单参数(一个形参和一个有默认值的形参也算)的构造函数前,此构造函数会不能进行隐式转换,参数必须完全符合才可以调用,否则报错
for( decl : coll ){
statment
}
vector=default ,=deletevec; for(auto elem:vec){//将vec中的元素一个一个复制到elem中, cout< //想要修改只能用引用,且使用引用更快,引用只有四个字节 elem *= 3 }
C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:
(1)构造函数
(2)析构函数
(3)拷贝构造函数
(4)拷贝赋值函数(operator=)
(5)移动构造函数
如果自己定义了一个ctor(构造函数),那么编译器就不会在给一个default ctor(默认构造),如果强制在(big three 拷贝构造,=的操作符重载,析构函数)后面加上=default,就会获得default ctor,=delete就是不要
拷贝构造和拷贝赋值(=操作符重载)都只能存在一个,因此只能用=delete
- ps:当一个类存在指针成员的时候,都需要自己定义big three,如果没有就不需要写
C++开发中,我们经常需要控制某些函数的生成,例如不希望函数被复制,被生成。在C++11之前,我们经常的普遍做法是将其声明为类的 private 成员函数,这样若在类外这些这些函数的操作时候,编译器便会报错,从而达到效果。



