c++ 11/14 笔记自用 (1)

Variadic Templates数量不定的模板参数

在这里插入图片描述
这是一个模板函数

  • typename后的… 表示’一包‘参数,类型任意。 注意…的位置,语法规定,记住就行
  • 只有typename是关键字,Type,arg都是自己命名
  • 于是上图的print函数 是递归打印不定个数,不定类型的参数
  • 1的定义必须有,不然只有一个参数时,会编译错误在这里插入图片描述
    可以并存

在这里插入图片描述
蓝框处是调用hash_val函数,调用的函数1。(2和3的第一个参数类型不符合)1在函数内再调用hash_val(),而2更加特化,1更泛化,因此选择调用函数2,2递归调用自己直到arg不够,到3终止,3是种终止条件必须有在这里插入图片描述不断的继承,参数减少,空参数的tuple必须存在,终止条件

Spaces in Template Expressions 模板标识中的空格

vector<list<> >以前的空格必须存在,现在不用

nullptr and std::nullptr_t

在这里插入图片描述

auto

自动推导类型

auto i=42;//int
double f();
auto d=f();//double

主要用于type很长或者很复杂

vector<string> v;
auto it=v.begin();//vector<string>::iterator
auto I=[](int x) ->bool{ //I has type of lambda
	...
};

在很多返回类型要取决于参数类型的时候,比如在函数模板中,因为你很有可能并不知道进行某种操作后自己会得到什么类型,因此函数的返回值需要写在函数名之后,使用auto进行类型推倒,请看下例

template<typename T, typename V>
 auto addWithTwoTypes(T t, V v) -> decltype(t + v) {
   return t + v;
 }

上边这个函数会返回T类型变量和V类型变量的和,如果T和V分别是short和int,那么返回类型就会自动推断为int,但是如果一个是double一个是int,那么返回类型就会是double。因此,返回值类型和两个模板类型都相关。

Uniform Initialization 一致性初始化

在这里插入图片描述
初始化时,可以在变量名后加{},进行初始化

Initializer Lists

在一个变量或者对象后面加{},进行初始化,就是形成了一个Initializer Lists,会关联到一个array<T,n>,如果构造函数中没有以 Initializer Lists为参数的(所有的容器都有这样的构造函数),那就会将{}中的元素一个一个拆解进行赋值

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()以前只能接受两个参数,现在可以用大括号包起来,任意多的参数
    *在这里插入图片描述

explicit for ctors taking more than one argument 在多于一个参数的构造函数前加explicit

  • 2.0之前 只能用在单参数(一个形参和一个有默认值的形参也算)的构造函数前,此构造函数会不能进行隐式转换,参数必须完全符合才可以调用,否则报错

range-based fir statment

for( decl : coll ){
	statment
}
vector<double> vec;
for(auto elem:vec){//将vec中的元素一个一个复制到elem中,
	cout<<elem<<endl;
}
for(auto& elem:vec){//想要修改只能用引用,且使用引用更快,引用只有四个字节
	elem *= 3
}

=default ,=delete

C++中,当我们设计与编写一个类时,若不显著写明,则类会默认为我们提供如下几个函数:

(1)构造函数
(2)析构函数
(3)拷贝构造函数
(4)拷贝赋值函数(operator=)
(5)移动构造函数
如果自己定义了一个ctor(构造函数),那么编译器就不会在给一个default ctor(默认构造),如果强制在(big three 拷贝构造,=的操作符重载,析构函数)后面加上=default,就会获得default ctor,=delete就是不要

在这里插入图片描述
在这里插入图片描述
拷贝构造和拷贝赋值(=操作符重载)都只能存在一个,因此只能用=delete

  • ps:当一个类存在指针成员的时候,都需要自己定义big three,如果没有就不需要写

C++开发中,我们经常需要控制某些函数的生成,例如不希望函数被复制,被生成。在C++11之前,我们经常的普遍做法是将其声明为类的 private 成员函数,这样若在类外这些这些函数的操作时候,编译器便会报错,从而达到效果。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值