c++11新特性

目  录

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] = { 1, 2, 3, 7, 10 };

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_t和char32_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++ 编译器也支持这种类别。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<int> list){}

};

A a = { 1, 4, 5, 6 };

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 i) override

{

}

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<int, less<int>> a;

17 多线程支持

18 多元组tuple


#include <map>

int i = 10;

char c = ‘a‘;

const char *s = "hello world";

typedef std::tuple <int, char, const 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

时间: 2024-10-10 16:46:56

c++11新特性的相关文章

C++11 新特性之 tuple

我们在C++中都用过pair.pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.pair可以使用make_pair构造 pair<int, string> p = make_pair(1, "a1"); 如果传入的参数为多个,那么就需要嵌套pair,如下代码 #include <iostream> #include <map> using namespace std; int main() { //<int, string,

C++11 新特性之 变长参数模板

template <typename ... ARGS> void fun(ARGS ... args) 首先明确几个概念 1,模板参数包(template parameter pack):它指模板参数位置上的变长参数,例如上面例子中的ARGS 2,函数参数包(function parameter pack):它指函数参数位置上的变长参数,例如上面例子中的args 一般情况下 参数包必须在最后面,例如: template <typename T, typename ... Args>

【C++11】30分钟了解C++11新特性

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 什么是C++11 C++11是曾经被叫做C++0x,是对目前C++语言的扩展和修正,C++11不仅包含核心语言的新机能,而且扩展了C++的标准程序库(STL),并入了大部分的C++ Technical Report 1(TR1)程序库(数学的特殊函数除外). C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decl

[C++11新特性]第二篇

0.可变数量参数,可变函数模版,变长模版类 c++98可变数量参数 #include<cstdio> #include<cstdarg> double SumOfFloat(int count, ...) { va_list ap; double sum=0; va_start(ap,count); for(int i=0;i<count;i++) sum+=va_arg(ap,double); va_end(ap); return sum; } int main() { p

C++11 新特性(5) 统一初始化

在C++11之前,初始化的类型并非总是统一的. 例如以下两个man定义,一个作为结构,一个作为类.两者的初始化是不一样的. #include <iostream> using namespace std; struct manStruct{ string name; int age; }; class manClass { private: string name; int age; public: manClass(string s,int a):name(s),age(a){ } }; i

[cocos2d-x] 一些C++ 11新特性的引入

1.auto关键字的使用 auto关键字原理     在定义变量的时候必须申明类型,c++是强语言类型,在编译阶段需要知道类型,这样的好处是程序效率更高,而动态语言不需要类型申明的需要自推导变量类型.使用了auto是不是c++效率会变慢?完全不是,因为在编译阶段编译器已经帮程序员推导好了变量的类型.前提条件是编译器可以根据当前的程序的状态推导出变量类型.只是编译器更加智能,可能会增加编译工作,但是不会影响运行效率. 实例1:申明普通变量 auto num = 10; 实例2: vector<st

c++11 新特性之 auto关键字

C++11是对目前C++语言的扩展和修正.C++11包括大量的新特性:包括lambda表达式,类型推导关键字auto.decltype,和模板的大量改进. g++编译c++11命令加上 -std=c++11 C++11中引入auto第一种作用是为了自动类型推导 auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型.通过auto的自动类型推导,可以简化我们的编程工作 auto实际上实在编译时对变量进行了类型推导,所以不会对程序的运行效率造成不良影响另外,似乎auto并不会影响编译速度,

C++11 新特性之 decltype关键字

decltype关键字用于查询表达式的类型.与其他特性结合起来之后会有意想不到的效果. decltype的语法是 decltype (expression) 实例: #include <iostream> #include <typeinfo> using namespace std; int main() { int i; double d; float f; struct A { int i; double d; }; decltype(i) i1; cout <<

C++11 新特性(6) 基于范围的for循环

C++11中添加了一项基于范围的for循环,这可以省却我们很多的代码量. 来自维基百科的解释:http://zh.wikipedia.org/wiki/C++0x#.E5.80.99.E9.81.B8.E8.AE.8A.E6.9B.B4 Boost C++ 定义了许多"范围 (range) "的概念.范围表现有如受控制的列表 (list),持有容器中的两点.有序容器是范围概念的超集 (superset),有序容器中的两个迭代器 (iterator) 也能定义一个范围.这些概念以及操作的

C++11新特性:自动类型推断和类型获取

声明:本文是在Alex Allain的文章http://www.cprogramming.com/c++11/c++11-auto-decltype-return-value-after-function.html的基础上写成的. 加入了很多个人的理解,不是翻译. 转载请注明出处 http://blog.csdn.net/srzhz/article/details/7934483 自动类型推断 当编译器能够在一个变量的声明时候就推断出它的类型,那么你就能够用auto关键字来作为他们的类型: [c