不知道C++这七大特性,绝对枉为圈中人(2)
以上代码是constexpr的常见例子之一。既然声明斐波那契数列函数为constexpr, 那么编译器就可以在编译时预运算fib(20). 所以编译之后,可以用constlong long bigval = 2432902008176640000来替代const longlong bigval = fib(20). 请注意,传递参数是一个const 值。这是被声明为constexpr的函数的一个重点——传递参数应该是constexpr或const。否则这里的函数会和普通函数一样,也就是说编译时不进行预运算。 变量也可以是constexpr. 在这种情况下,这些变量在编译时必须可评估;否则会出现编译错误。 有趣的是,后来在C++17中引入了constexpr-if 和constexpr-lambda. 5. Tuples元组 与pair非常类似, tuple是各种数据类型的固定大小值的集合。 有时,相比于tuple,使用 std::array更方便。array类似于带有C++标准库的功能的plain C阵列。这个数据结构是C++11新增的。 6. 类模板参数推导 这个特性的名字还挺啰嗦。从C++17开始,标准类模板也可以进行模板参数推导。之前,模板参数推导只支持函数模板。结果就是:
这种推导是“隐性的”。这对于tuple来说就更方便了。
以上这一特性对不熟悉C++模板的人来说没有太大用处。 7. 智能指针 指针有时很恐怖。由于C++语言为程序员提供了很大程度的自由,所以有时很容易搬起石头砸自己的脚。而且很多情况下,麻烦是由指针造成的。 幸运的是,C++11引入了智能指针,智能指针比普通指针便捷得多。它们通过适时释放内存来帮助程序员防止内存泄漏。它们还有助于代码达到异常安全等级。
(编辑:ASP站长网) |