功夫阿拉克的博客

c plus plus11新特性

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 void swap(T &a,T &b)
例:类模板声明
template class A{public:T a;T b;T hy(T c,T &d);};
例:类模板外部定义成员函数的方法为
template void A::h(){}

(2)模板的特化
针对某个特定的类型,在定义的时候给出不同一般数据类型的逻辑实现。而在使用的时候,
这个特殊性完全被屏蔽,你仍然只需要按照模板来使用,但是编译器会根据你之前的设定,
给特别的数据类型以特定的代码逻辑。
例:
template class stack{};
template<> class stack{};//bool型比较节省空间
例:
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 void f(T); //(a)
对基模板(a)重载
template void f(*T);