C++11的新特性

1.

auto自动变量(vs 2010支持)

2.

C++11新增模板类array

C++11支持对模板类vector的列表初始化。

3. 

C++11新增了另一种引用,右值引用,是使用&&声明的:

double j = 15.0;
double && jref = 2.0*j + 18.5; //不能使用double &声明jref

4. 

C++11中模板函数的改善

(1). C++11新增了关键字decltype,解决模板函数中类型定义的问题。

template<class T1, class T2>
void ft(T1 x, T2 y)
{
  ...
  decltype(x+y) xpy = x+y;  
  ...    
}

(2). C++11后置返回类型。

auto h(int x, float y) -> double
{/*function body*/}

其中auto是一个占位符,表示后置返回类型提供的类型。

5. C++11提供【线程存储持续性】的方案来存储数据

如果变量是使用关键字thread_local声明的,则其生命周期与所属线程一样长。

6. 

初始化动态分配的常规结构或数组(需要用大括号)

struct where 
{
    double x;
    double y;
    double z;     
}

where* pi = new where {28.1, 33,4, 52.1};//C++11

int *pj = new int [3] {1, 2, 3};//C++11

同样,列表也可用于单值初始化。

7. 

C++11中,可将列表初始化运用到类(就像应用于结构和数组那样)。

//若Stock类的构造函数声明如下(此处有默认参数):
Stock::Stock(const std::string & co, longn = 0, double pr = 0.0);

//则Stock类的对象可以用列表初始化:
Stock hot_tip = {"apple", 1000};

 C++11提供了名为std::initialize_list的类,可将其作为函数参数或方法参数的类型。

8. 

在C++98中只能使用这种技术声明值为整数或枚举的静态常量,而不能存储double常量。(但C++11消除了这个限制)

9.

C++11提供了一种新的枚举——作用域内枚举(其枚举的作用域为类):

enum class egg {Small, Medium, Large};// or enum struct egg {Small, Medium, Large};

可以使用作用域解析运算符访问枚举成员。

枚举类成员不能像常规枚举一样,隐式地转换为某种底层整型类型(提高了作用域内枚举的类型安全),但可以进行强制类型转换。.

C++11 可以选择底层整型类型(默认为int):

enum class : short egg {Small, Medium, Large};//:short将底层整型类型指定为short

 10.

在C++98中,关键字explicit不能用于转换函数,但C++11消除了这个限制,在C++11中可将转换运算符声明为显式的。

11.

C++11新增关键字nullptr来表示空指针。(VS 2010支持)

12.

C++11允许类内初始化

class Classy
{
  int mem1 = 10;//类内初始化
  const int mem2 = 20;//类内初始化    
  //...  
};

//等价于成员初始化列表
Classy::Classy() : mem1(10), mem(20) 
{
 ...       
}

//C++11类内初始化过的类,覆盖成员函数的默认值
Classy::Classy(int n) : mem1(n) 
{
 ...       
}

 13.

禁用默认函数的方法:

1. 将函数声明为私有的;

2. C++11 使用关键字delete实现。

14.

C++11新增了一项功能——使用模板提供一系列别名:

template<typename T>
    using arrtype = std::aray<T, 12>;

//模板别名arrtype的使用
arrtype<int> days;

C++11还支持可变参数模板

原文地址:https://www.cnblogs.com/sungnox/p/7588073.html