首页 > 编程语言 > 详细

c++11新特性

时间:2015-02-09 23:13:55      阅读:723      评论:0      收藏:0      [点我收藏+]

目  录

1 常数表达式 3

2 空指针 3

3 类型推导 3

4 以范围为基础的 for 循环 3

5 无限制的union 3

6 新的字符串字面值 4

7 long long int类别 4

8 允许sizeof运算符作用在类型的数据成员上,无须明确的对象 4

9 初始化列表 5

10 统一初始化 5

11 对象构造的改良和成员变量初始化 5

12 显示虚拟函数重载 6

13 禁止默认构造函数 6

14 外部模板 7

15 Lambda函数 7

16 右值引用和move 7

17 角括号>> 8

18 多线程支持 8

19 多元组tuple 8

20 散列表 8


1 常数表达式

目前不被VS2013支持

constexpr int test() 

{

return 5

}

 

int main()

{

int buf[test() + 5];

return 0;

}

 

2 空指针

int * pi = nullptr;

int i = nullptr;

int i = NULL;

 

 

3 类型推导

auto i = ‘a‘;

decltype(i) a;

 

4 以范围为基础的 for 循环

int my_array[5] = { 123710 };

for (int &x : my_array){}

5 无限制的union

vs2013目前不支持

class A

{

public:

A() {}

A(int i){ this->i = i; }

int i = 10;

};

union

{

int a1;

double b;

A a;

};

 

6 新的字符串字面值

C++11 将支持三种Unicode编码方式:UTF-8UTF-16,和UTF-32。除了上述char定义的变更, C++11将增加两种新的字符类别:char16_tchar32_t。它们各自被设计用来存储UTF-16 以及UTF-32的字符。

VS2013目前不支持

const char *s1 = u8"UTF-8 string.";

const char16_t *s2 = u"UTF-16 string.";

const char32_t *s3 = U"UTF-32 string.";

 

7 long long int类别

在 32 比特系统上,一个 long long int 是保有至少 64 个有效比特的整数类别。C99 将这个类别引入了标准 中,目前大多数的 C++ 编译器也支持这种类别。C++11 将把这种类别添加到标准 C++ 中。

 

 

8 允许sizeof运算符作用在类型的数据成员上,无须明确的对象

vs2013目前不支持

class A

{

public:

A() = delete//显示通知编译器,不生成默认的构造函数

//A() = default;

A(int i)

{

this->i = i;

}

int i;

};

sizeof(A::i)

 

 

9 初始化列表

class A

{

public:

A(std::initializer_list<intlist){}

};

A a = { 1456 };

 

10 统一初始化

class A

{

public:

string name;

int id;

};

A a{ "tom"4 };

 

11 对象构造的改良和成员变量初始化

class A

{

public:

A() :A(20)

{}

A(int i)

{

id = i;

}

int id = 10;

};

 

12 显示虚拟函数重载

class A 

{

public:

virtual void test(int i){}

};

 

class B : public A 

{

virtual void test(int ioverride

{

 

}

virtual void test1(float i//override

{

 

}

};

13 禁止默认构造函数

class A

{

public:

A() = delete//显示通知编译器,不生成默认的构造函数

//A() = default;

A(int i)

{

this->i = i;

}

int i;

};

 

14 外部模板

告诉编译器不要在该编译单元内将该模板实例化。

extern template class std::vector<int>;

 

Lambda函数

#include <algorithm>

std::vector<int> a;

a.push_back(1);

a.push_back(2);

a.push_back(3);

int total = 0;

std::for_each(a.begin(), a.end(), [&total](int x) {total += x;});

std::cout << total;

 

15 右值引用和move

在C++03之前,右值位于运算符右边,其值无法改变。

左值是指表达式结束之后依然存在的持久对象,右值是表达式结束之后就不存在的临时对象。能否对表达式取地址就是判断左值右值的最简单方法。

class A{};

 

int main()

{

int i = 10;

int a = 4;

int b = 3;

i = a + b;

A test = A();

return 0;

}

 

move的功能就是将一个左值强制转化为一个右值引用。如果一个对象明确被其他对象引用后便不再使用,那么可以采用浅拷贝方式实现其拷贝构造函数,浅拷贝完成后将其指针成员赋NULL;

class A {};

 

int main()

{

A a;

A&& b = move(a);

}

 

16 角括号>>

set<intless<int>> a;

 

17 多线程支持

 

18 多元组tuple

#include <map>

int i = 10;

char c = ‘a‘;

const char *s = "hello world";

typedef std::tuple <intcharconst char *> mytuple;

mytuple a(i, c, s);

int i1  = std::get<0>(a); 

const char *s1 = std::get<2>(a);

 

19 散列表

std::unordered_set

std::unordered_multiset

std::unordered_map

std::unordered_multimap

#include <unordered_set>

unordered_multiset<int> myset;

myset.insert(10);

myset.insert(20);

unordered_multiset<int>::iterator it;

for (it = myset.begin(); it != myset.end(); ++it)

{

cout << *it << endl;

}

 


word 下载  http://www.sundaboke.com/C++11.doc

c++11新特性

原文:http://blog.csdn.net/sundaboke/article/details/43673463

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!