c++11
来源:互联网 发布:如何建立网络连接 编辑:程序博客网 时间:2024/04/30 15:04
变量的大括号赋值(初始化器)、类型转换(不允许缩窄)
char c1{221};
char c2 = {221};
char c4 = {c1};
auto 声明 自动判断变量类型 用于STL 效果强大
auto n = 100; //int
auto x = 1.4; //double
auto y = 1.2e12L; //long double
原始(raw)字符串 前缀R使用"( 和 )" 做界定符 不进行转义可与其它字符串前缀结合使用
cout << R"(Li "Wang" tu \n some.)" << '\n';
cout << R"+*("abc)",she.)+*" <<endl; 自定义界定符"+*( )+*" 替换了"( )"界定符
decltype(x+y) a; 声明变量a 其类型与x+y的结果类型相同
auto h(int x, float y) -> decltype(x+y); 后置返回类型,auto 是占位符
register (寄存器变量)关键字变为了原auto 关键字的功能
基于范围的for 循环
int a[3] = {1,2,3};
for (int x : a) std::cout <<a <<std::endl;
模板initializer_list 头文件initializer_list
初始化器,大括号括起
如vector<double> pay {12.3, 12, 12.3, 22} 创建一个4个元素的容器,相当于vector<double> pay ({12.3, 12, 12.3, 22})
容器类重载了将initializer_list<T>作为参数的构造函数
该模板类包含成员函数begin()、end()、size() 可用于访问列表元素,迭代器类型为const 因此不能修改值,其初衷是能够将一系列值传递给构造函数或其他函数
using Type = int; 创建别名
作用域内枚举
enum old {yes,no} //传统
enum class new1{never, sometime} //新型
enum struct new2{never,lever} //新型
新型枚举要求进行显式限定,以免发生名称冲突,因此引用时需用 new1::never
右值引用 (可关联到右值,即可出现在赋值表达式右边,但不能对其应用地址运算符的值)
int x = 1;
int y = 2;
int && r1 = 12;
int && r2 = x + y;
移动语义
string(string && str);
用右值引用 && 表示参数,可在进行深复制或赋值时直接转移所有权。
强制移动
方法一、让左值进行所有权转移时可使用 static_cast<Type &&> 使其转为右值
方法二、使用头文件 utility 中声明的 std::move()
类的特殊成员函数在原有(默认构造函数、复制构造函数、赋值运算符、析构函数)的基础上,新增了移动构造函数和移动赋值运算符
默认方法和禁用方法
class String
{
public:
String(const String &) = default;//使用默认的复制构造函数
String & operator=(const String &) = delete;//禁止赋值运算符
};
关键字default 只能用于6个特殊成员函数,但delete 可用于任何成员函数
委托构造函数,可以在一个构造函数中调用另一个构造函数。
继承构造函数,可以在派生类中继承基类构造函数。
C++98中,类似名称空间可用,在派生类方法中加入 using base::fun;//在派生类中可使用基类的所有fun方法(非特殊成员函数),但将选择派生类而不是基类定义的方法。C++11可将这种方法用于构造函数,以便调用基类构造函数初始化数据,或直接使用基类构造函数初始化数据。(视特征标而定)
管理虚方法
C++98中,基类定义了虚函数,派生类中只要定义了该函数,不论特征标如何,基类版本都将不可用。C++11中,可使用虚说明符override 指出将要覆盖的一个虚函数,将其放在参数列表后面,如果基类中没有该特征标版本将出错。说明符final 放在基类的虚函数后将禁止派生类重新定义该函数。
lambda 函数
1.可使用匿名函数,如 [] (int x) { return x%3 == 0;}//该函数使用[]代替函数名(匿名),不声明返回类型,返回类型相当于使用decltyp 根据返回值推断得到,这里为bool。如果lambda 不包含返回语句,推断出的类型为void ,仅当lambda 表达式完全只由一条返回语句组成时,自动类型推断才管用,否则,需使用返回类型后置语法,如 [](double x)->double{int y = x; return x-y;} 有除返回语句之外的语句,需使用类型后置语法。
2.可以使用auto mod3 = [](int x){return x%3 == 0;} 建立有名称的lambda 以便多次使用。
3.中括号内部可以捕获作用域内的动态变量,以便于lambda 内部使用。如[&count] 将按引用访问该变量,[&] 使得能按引用访问所有动态变量,[=]使得能按值访问所用动态变量
# lambda使得可在函数内定义函数。
包装器(适配器)
包括:模板bind、mem_fn、reference_wrapper 以及包装器 function
其中
模板bind 可替代bind1st 和bind2nd,但更灵活
模板mem_fn 能够将成员函数作为常规函数进行传递
模板reference_wrapper 能够创建行为像引用但可被复制的对象
包装器function 使得能够以统一的方式处理多种类似于函数的形式
std::function<double(double)> fp = square; //模板参数为square函数的特征标
typedef std::function<double(double)> fdd;
fdd(square); //另一种使用方式,可直接把fdd(square) 作为参数使用。
或
template <typename T>
T use_f(T v, std::function<T(T)> f) //定义被调用函数,此时可使用各种方式作为二参且能保证调用同一实例。
可变参数模板
C++11 提供了一个用省略号表示的元运算符
template<typename... Args>
void show_list(Args... args){ }
Args是一个模板参数包,args是一个函数参数包,如show_list('s',10,"swe") 调用中Args包含char、int、const char * 而args 包含's',10,"swe"
递归 template<typename T,typename... Args> void show_list(T value,Args... args) 可以对参数包的每个值进行操作。
新增的库
头文件 random 支持的可扩展随机数库提供了大量比rand() 复杂的随机数工具,可选择分布状态,包括均匀分布、二项式分布和正态分布等。
头文件 chrono 提供了处理时间间隔的途径
头文件 ratio 支持的编译阶段有理数算术库能准确地表示任何有理数。
头文件 regex 支持正则表达式库
杂项
头文件 cstdint 依赖于实现的扩展整型
字面量运算符 1001001b 将把它转换为整数值
新增关键字 static_assert 可用于在编译阶段对断言进行测试(断言通常是程序员认为在程序的某个阶段应为true的东西,c++之前提供的是 assert 是一个宏),目的是为在编译阶段实例化的模板,调试更简单。
加强了对元编程(metaprogramming)的支持。元编程指的是编写的程序能创建或修改其他程序,甚至修改自身。
char c1{221};
char c2 = {221};
char c4 = {c1};
auto 声明 自动判断变量类型 用于STL 效果强大
auto n = 100; //int
auto x = 1.4; //double
auto y = 1.2e12L; //long double
原始(raw)字符串 前缀R使用"( 和 )" 做界定符 不进行转义可与其它字符串前缀结合使用
cout << R"(Li "Wang" tu \n some.)" << '\n';
cout << R"+*("abc)",she.)+*" <<endl; 自定义界定符"+*( )+*" 替换了"( )"界定符
decltype(x+y) a; 声明变量a 其类型与x+y的结果类型相同
auto h(int x, float y) -> decltype(x+y); 后置返回类型,auto 是占位符
register (寄存器变量)关键字变为了原auto 关键字的功能
基于范围的for 循环
int a[3] = {1,2,3};
for (int x : a) std::cout <<a <<std::endl;
模板initializer_list 头文件initializer_list
初始化器,大括号括起
如vector<double> pay {12.3, 12, 12.3, 22} 创建一个4个元素的容器,相当于vector<double> pay ({12.3, 12, 12.3, 22})
容器类重载了将initializer_list<T>作为参数的构造函数
该模板类包含成员函数begin()、end()、size() 可用于访问列表元素,迭代器类型为const 因此不能修改值,其初衷是能够将一系列值传递给构造函数或其他函数
using Type = int; 创建别名
作用域内枚举
enum old {yes,no} //传统
enum class new1{never, sometime} //新型
enum struct new2{never,lever} //新型
新型枚举要求进行显式限定,以免发生名称冲突,因此引用时需用 new1::never
右值引用 (可关联到右值,即可出现在赋值表达式右边,但不能对其应用地址运算符的值)
int x = 1;
int y = 2;
int && r1 = 12;
int && r2 = x + y;
移动语义
string(string && str);
用右值引用 && 表示参数,可在进行深复制或赋值时直接转移所有权。
强制移动
方法一、让左值进行所有权转移时可使用 static_cast<Type &&> 使其转为右值
方法二、使用头文件 utility 中声明的 std::move()
类的特殊成员函数在原有(默认构造函数、复制构造函数、赋值运算符、析构函数)的基础上,新增了移动构造函数和移动赋值运算符
默认方法和禁用方法
class String
{
public:
String(const String &) = default;//使用默认的复制构造函数
String & operator=(const String &) = delete;//禁止赋值运算符
};
关键字default 只能用于6个特殊成员函数,但delete 可用于任何成员函数
委托构造函数,可以在一个构造函数中调用另一个构造函数。
继承构造函数,可以在派生类中继承基类构造函数。
C++98中,类似名称空间可用,在派生类方法中加入 using base::fun;//在派生类中可使用基类的所有fun方法(非特殊成员函数),但将选择派生类而不是基类定义的方法。C++11可将这种方法用于构造函数,以便调用基类构造函数初始化数据,或直接使用基类构造函数初始化数据。(视特征标而定)
管理虚方法
C++98中,基类定义了虚函数,派生类中只要定义了该函数,不论特征标如何,基类版本都将不可用。C++11中,可使用虚说明符override 指出将要覆盖的一个虚函数,将其放在参数列表后面,如果基类中没有该特征标版本将出错。说明符final 放在基类的虚函数后将禁止派生类重新定义该函数。
lambda 函数
1.可使用匿名函数,如 [] (int x) { return x%3 == 0;}//该函数使用[]代替函数名(匿名),不声明返回类型,返回类型相当于使用decltyp 根据返回值推断得到,这里为bool。如果lambda 不包含返回语句,推断出的类型为void ,仅当lambda 表达式完全只由一条返回语句组成时,自动类型推断才管用,否则,需使用返回类型后置语法,如 [](double x)->double{int y = x; return x-y;} 有除返回语句之外的语句,需使用类型后置语法。
2.可以使用auto mod3 = [](int x){return x%3 == 0;} 建立有名称的lambda 以便多次使用。
3.中括号内部可以捕获作用域内的动态变量,以便于lambda 内部使用。如[&count] 将按引用访问该变量,[&] 使得能按引用访问所有动态变量,[=]使得能按值访问所用动态变量
# lambda使得可在函数内定义函数。
包装器(适配器)
包括:模板bind、mem_fn、reference_wrapper 以及包装器 function
其中
模板bind 可替代bind1st 和bind2nd,但更灵活
模板mem_fn 能够将成员函数作为常规函数进行传递
模板reference_wrapper 能够创建行为像引用但可被复制的对象
包装器function 使得能够以统一的方式处理多种类似于函数的形式
std::function<double(double)> fp = square; //模板参数为square函数的特征标
typedef std::function<double(double)> fdd;
fdd(square); //另一种使用方式,可直接把fdd(square) 作为参数使用。
或
template <typename T>
T use_f(T v, std::function<T(T)> f) //定义被调用函数,此时可使用各种方式作为二参且能保证调用同一实例。
可变参数模板
C++11 提供了一个用省略号表示的元运算符
template<typename... Args>
void show_list(Args... args){ }
Args是一个模板参数包,args是一个函数参数包,如show_list('s',10,"swe") 调用中Args包含char、int、const char * 而args 包含's',10,"swe"
递归 template<typename T,typename... Args> void show_list(T value,Args... args) 可以对参数包的每个值进行操作。
新增的库
头文件 random 支持的可扩展随机数库提供了大量比rand() 复杂的随机数工具,可选择分布状态,包括均匀分布、二项式分布和正态分布等。
头文件 chrono 提供了处理时间间隔的途径
头文件 ratio 支持的编译阶段有理数算术库能准确地表示任何有理数。
头文件 regex 支持正则表达式库
杂项
头文件 cstdint 依赖于实现的扩展整型
字面量运算符 1001001b 将把它转换为整数值
新增关键字 static_assert 可用于在编译阶段对断言进行测试(断言通常是程序员认为在程序的某个阶段应为true的东西,c++之前提供的是 assert 是一个宏),目的是为在编译阶段实例化的模板,调试更简单。
加强了对元编程(metaprogramming)的支持。元编程指的是编写的程序能创建或修改其他程序,甚至修改自身。
0 0
- C(11)
- 11C
- [C/C++][2012-11-29] __attribute__ 详解
- 11-22C/C++/python程序编程
- 11/24 C/C++/Python程序bainchen
- c练习11
- C语言例题11:
- linux0.11 build.c
- c语言练习11
- 【C语言】11-指针
- 11,标准C
- 【C语言】11-指针
- C指针原理(11)
- 介绍了C + + 11
- 【C语言】11-指针
- C-枚举(11)
- 【C语言】11-指针
- 【C语言】11-指针
- 永记今日
- Edit Distance
- Ext3.2 布局——anchor layout
- Mac OS X:sudo 命令需要非空的管理员密码
- linux安装网卡驱动
- c++11
- php配置yii框架
- Linux下查看主机支持的内存
- Ural1017(DP)
- 微信公众平台的通讯过程
- 印度央行担心比特币信誉,但是没有叫停它(来自于http://techcrunch.com/)
- 最新MySQL安装配置教程
- set_f1于clr_f1
- SlidingMenu的调用方法