C++ 11 新特性之杂项

前 10 篇在这里:

这是C++11新特性介绍的第十一部分,涉及到一些不好归类的新特性。

不想看toy code的读者可以直接拉到文章最后看这部分的总结。

类型别名声明

类似typedef,新标准中可以使用using为类型声明一个别名(alias)。

range for

range for语句在之前的章节中已经见识过了:

这里需要注意的是,在第二个例子中,range for语句中可以直接使用引用,从而修改被迭代遍历的对象本身。

另外,range for不能用于动态分配内存的数组,因为动态分配的内存中没有begin、end方法可供调用。

新的除法舍入规则

新标准中,重新统一了除法的舍入规则。主要需要留意两数符号不同时的规则:

(-x) / y = x / (-y) = – (x / y)
x % (-y) = x % y
(-x) % y = – (x % y)

尾置返回类型

之前,我们也见识过尾置返回类型和decltype的配合使用。有时,采用尾置返回类型,代码的可读性更高。

使用字符串作为文件名

在新标准中,可以直接使用string作为文件名进行文件流处理,而不必要求C风格字符数组。

字符串和数值的转换

新标准中,添加了多个函数用于string和数值之间的转换。

bind 函数

新标准中,提供了功能更强大的参数绑定函数bind,用于替换原有的bind1st和bind2nd。

std::placeholders::_1表示占位符,指代第1个参数,等待后续真正调用时由用户传入。

显式类型转换

新标准中,可以指定一个类型转换为显式(explicit)的。指定为显式的类型转换,不能再进行隐式转换。

这其中有一个例外,即,即使指定一个类型和bool类型之间的转换是显式的,在if语句中,也仍然可以执行隐式类型转换。

内联命名空间

新标准中引入了内联命名空间。内联命名空间内的名字可以不加命名空间名字前缀,直接在外层命名空间中使用。这为我们设置一个默认的命名空间提供了方便。

只需在第一次声明内联命名空间时加上inline关键字,之后就可以省略了。

限定作用域的 enum

新标准中,可以通过enum class foo这样的形式定义一个限定作用域的枚举,其中的枚举变量在作用域之外不可见。

其中,one、two、three就只能在number限定的作用域中可见,而CHN、USA、FRA就没有这个限制。

指定枚举的数据类型

新标准中,可以指定枚举的数据类型为除了int之外的其他整数类型。

输出

整个测试程序的输出结果如下:

总结

  1. 类似typedef,新标准中可以使用using为类型声明一个别名(alias)。
  2. range for语句可以方便的迭代对象,并且支持引用迭代。
  3. range for不能用于动态分配内存的数组。
  4. 新标准中,重新统一了除法的舍入规则。主要需要留意两数符号不同时的规则:

    (-x) / y = x / (-y) = – (x / y)
    x % (-y) = x % y
    (-x) % y = – (x % y)

  5. 可以采用尾置返回类型,提高代码的可读性。
  6. 可以直接使用string作为文件名进行文件流处理,而不必要求C风格字符数组。
  7. 添加了多个函数用于string和数值之间的转换。
  8. 提供了功能更强大的参数绑定函数bind,用于替换原有的bind1st和bind2nd。
  9. 可以指定一个类型转换为显式(explicit)的。指定为显式的类型转换,不能再进行隐式转换。有一个例外,即,即使指定一个类型和bool类型之间的转换是显式的,在if语句中,也仍然可以执行隐式类型转换。
  10. 引入了内联命名空间。内联命名空间内的名字可以不加命名空间名字前缀,直接在外层命名空间中使用。
  11. 可以通过enum class foo这样的形式定义一个限定作用域的枚举,其中的枚举变量在作用域之外不可见。
  12. 可以指定枚举的数据类型为除了int之外的其他整数类型。

完整代码详见misc.cpp

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 2 收藏 评论

关于作者:usher2007

游戏开发 C/C++ Python Linux 个人主页 · 我的文章 · 9 ·    

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部