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)的支持。元编程指的是编写的程序能创建或修改其他程序,甚至修改自身。
0 0
原创粉丝点击