1.新的关键字
auto:为了自动类型推导(在编译时对类型进行类型推导,不影响运行效率)
例:auto i=1;
decltype:可以从一个变量或表达式中得到类型
例:int x=3;
decltype(x) y=x;
nullptr:为解决原来c++中null的二义性问题而引进的一种新的类型,因为null实际代表0
void F(int a)
{
cout<<a<<endl;
}
void F(int *p)
{
assert(p!=NULL);
cout<<p<<endl;
}
int main()
{
int *p=nullptr;
int *q=NULL;
bool equal=(p==q);//equal的值为true,说明p和q都是空指针
int a=nullptr;//编译失败,nullptr不能转型为int
F(0);//在c++98中编译失败,有二义性;在c++11中调用F(int)
F(nullptr);
return 0;
}
2.更优雅的初始化方法
在引入c++11之前,只有数组能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:
int arr[3]={1,2,3};
vector<int> v(arr,arr+3);
在c++11中,我们可以使用以下语法来进行替换:
int arr[3]{1,2,3};
vector<int> iv{1,2,3};
map <int,string>{{1,"a"},{2,"b"}};
string str{"Hello World"};
3.可变模板参数
(1)
template<typename...T>
void fun(T...args)
{
cout<<sizeof...(args)<<endl;
}
(2)
template<typename...Element> class tuple;
tuple<int,string> a;
(3)
template <typename T,unsigned PrimaryDimesion,unsign...Dimesions>
class array{/**/};
array<double,3,3> rotation_matrix;
(4)
template<typename...Elements> class tuple;//利用递归
template<typename Head,typename...Tail>
class tuple<Head,Tail...>:private tuple<Tail...>
{
Head head;
public:
/*implementation*/
}
template<> class tuple<>
{
/*zero-tuple implementation*/
};
4.模板
(1)通常有两种形式:函数模板和类模板;
函数模板针对仅参数类型不同的函数;
类模板针对仅数据成员和成员函数类型不同的类;
例:swap的模板函数形式为
template
例:类模板声明
template
例:类模板外部定义成员函数的方法为
template
(2)模板的特化
针对某个特定的类型,在定义的时候给出不同一般数据类型的逻辑实现。而在使用的时候,
这个特殊性完全被屏蔽,你仍然只需要按照模板来使用,但是编译器会根据你之前的设定,
给特别的数据类型以特定的代码逻辑。
例:
template
template<> class stack
例:
template
T mymax(const T t1,const T t2)
{
return t1
const charmymax(const char t1,const char *t2)
{
return(strcmp(t1,t2)<0)?t2:t1;
}
(3)模板的偏特化
类模板的偏特化
例:c++标准库中的类vector的定义
template
class vector{/…/};
template
class vector
函数模板的偏特化
严格的来说,函数模板不支持偏特化,但可以对函数进行重载,达到类似效果。
template
对基模板(a)重载
template