C++学习笔记(15)

二、C++11 静态断言
assert 宏是运行时断言,在程序运行的时候才能起作用。
C++11 新增了静态断言 static_assert,用于在编译时检查源代码。
使用静态断言不需要包含头文件。
语法:static_assert(常量表达式,提示信息);
注意:static_assert 的第一个参数是常量表达式。而 assert 的表达式既可以是常量,也可以是变量。
220、C++11 新标准
一、long long 类型
新增了类型 long long 和 unsigned long long,以支持 64 位(或更宽)的整型。
在 VS 中,int 和 long 都是 4 字节,long long 是 8 字节。
在 Linux 中,int 是 4 字节,long 和 long long 是 8 字节。
二、char16_t 和 char32_t 类型
新增了类型 char16_t 和 char32_t,以支持 16 位和 32 位的字符。
意义不大,好像没什么人用,连 demo 程序都找不到。 三、原始字面量
在《45、C++11 的原始字面量》中有详细介绍。 四、统一的初始化(列表)
C++11 丰富了大括号的使用范围,用大括号括起来的列表(统一的初始化列表)可以用于所有内置
类型和用户自定义类型。使用统一的初始化列表时,可以添加等号(=),也可以不添加:
int x={5};
double y{2.75};
short quar[5]{4,5,2,76,1};
统一的初始化列表也可以用于 new 表达式中:
int *ar=new int[4]{2,4,6,7};
创建对象时,也可以使用大括号(而不是圆括号)来调用构造函数:
class Girl
{
private:
int m_bh;
string m_name;
public:
Girl(int bh,string name) : m_bh(bh),m_name(name) {}
};
Girl g1(3, "西施"); // C++98 的风格。
Girl g2={5, "冰冰"}; // C++11 的风格。
Girl g3{8, "幂幂"}; // C++11 的风格。
STL 容器提供了将 initializer_list 模板类作为参数的构造函数:
vector<int> v1(10); // 把 v1 初始化为 10 个元素。
vector<int> v2{10}; // 把 v2 初始化为 1 个元素,这个元素的值是 10。
vector<int> v2{3,5,8}; // 把 v3 初始化为 3 个元素,值分别是 3、5、8。
头文件<initializer_list>提供了对模板类 initializer_list 的支持,这个类包含成员函数 begin()和 e
nd()。除了用于构造函数外,还可以将 initializer_list 用于常规函数的参数:
#include <iostream>
#include <initializer_list>
double sum(std::initializer_list<double> il)
{
double total = 0;
for (auto it = il.begin(); it != il.end(); it++)
total = total + *it;
return total;
}
int main()
{
// double total = sum( 3.14, 5.20, 8 ); // 错误,如果没有大括号,这是三个参数。
double total = sum({ 3.14, 5.20, 8 }); // 正确,有大括号,这是一个参数。
std::cout << "total=" << total << std::endl;
}
五、自动推导类型 auto
在《140、自动推导类型 auto》中有详细介绍。 六、decltype 关键字
在《146、函数模板高级》中有详细介绍。
七、函数后置返回类型
在《146、函数模板高级》中有详细介绍。 八、模板的别名
九、空指针 nullptr
空指针是不会指向有效数据的指针。以前,C/C++用 0 表示空指针,这带来了一些问题,这样的话 0
既可以表示指针常量,又可以表示整型常量。
C++11 新增了关键字 nullptr,用于表示空指针;它是指针类型,不是整型类型。
为了向后兼容,C++11 仍允许用 0 来表示空指针,因此表达式 nullptr==0 为 true。
使用 nullptr 提供了更高的类型安全。例如,可以将 0 传递给形参为 int 的函数,但是,如果将 null
ptr 传递给这样的函数,编译器将视为错误。
因此,出于清晰和安全考虑,请使用 nullptr。
十、智能指针
在《193、智能指针 unique_ptr》至《196、智能指针 weak_ptr》中有详细介绍。 十一、异常规范方面的修改
在《209、C++异常》中有详细介绍。 十二、强类型枚举(枚举类)
传统的 C++枚举提供了一种创建常量的方式,但类型检查比较低级。还有,如果在同一作用域内定
义的两个枚举,它们的成员不能同名。
针对枚举的缺陷,C++11 标准引入了枚举类,又称强类型枚举。
声明强类型枚举非常简单,只需要在 enum 后加上关键字 class。
例如∶
enum e1{ red, green };
enum class e2 { red, green, blue };
enum class e3 { red, green, blue, yellow };
使用强类型枚举时,要在枚举成员名前面加枚举名和::,以免发生名称冲突,如:e2::red,e3::blue
强类型枚举默认的类型为 int,也可以显式地指定类型,具体做法是在枚举名后面加上:type,type
可以是除 wchar_t 以外的任何整型。
例如:
enum class e2:char { red, green, blue };
十三、explicit 关键字
C++支持对象自动转换,但是,自动类型转换可能导致意外。为了解决这种问题,C++11 引入了 e
xplicit 关键字,用于关闭自动转换的特性。
在《121、自动类型转换》中有详细介绍。 十四、类内成员初始化
在类的定义中初始化成员变量。
class Girl
{
private:
int m_bh=20; // 年龄。
string m_name="美女"; // 姓名。
char m_xb = 'X'; // 性别。
public:
Girl(int bh, string name) : m_bh(bh), m_name(name) {}
};
十五、基于范围的 for 循环
在《184、基于范围的 for 循环》中有详细介绍。 十六、新的 STL 容器
1)array(静态数组)
array 的大小是固定的,不像其它的模板类,但 array 有 begin()和 end()成员函数,程序员可以 arr
ay 对象使用 STL 算法。
2)forward_list(单向链表)
3)unordered_map、unordered_multimap、unordered_set、unordered_multiset(哈希表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值