1、迈向现代C++(读《现代C++》有感)
1.1 被弃用的C++特性
注意: 弃用并非彻底不能用,只是用于暗示程序员这些特性将从未来的标准中消失,应该尽量避免使用。但是,已弃用的特性依然是标准库的一部分,并且出于兼容性的考虑,大部分特性其实会『永久』(permanently)保留。
不再允许字符串字面值常量赋值给一个 char *。如果需要用字符串字面值常量赋值和初始化一个 char *,应该使用 const char * 或者 auto。
char *str = "hello world!"; // A deprecation warning will appear
C++98 异常说明、unexpected_handler、set_unexpected() 等相关特性被弃用,应该使用 noexcept。 (用好C++中的异常对于程序员来说还是比较有难度的,使用错误码也不为一种解决之道)
auto_ptr 被弃用,应使用 unique_ptr。 (最大问题在于让一切赋值行为变成了资源转交。这一点不符合最小惊讶原则,你很难一上来就接受原件被“拷贝”以后会失效这件事,可能会导致对同一块堆空间进行多次delete)
register 关键字被弃用,可以使用但不再具备任何实际含义。 (编译器有自己的优化方式,不需要业余人士“指手画脚”)
bool 类型的 ++ 操作被弃用。
如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。 (弃用的原因是什么?防止不经意间的错误?)
C 语言风格的类型转换被弃用(即在变量前使用 (convert_type)),应该使用 static_cast、 reinterpret_cast、const_cast 来进行类型转换。
特别地,在最新的 C++17 标准中弃用了一些可以使用的 C 标准库,例如 <ccomplex>、 <cstdalign>、<cstdbool> 与 <ctgmath> 等
1.2 兼容C语言
兼容性如图所示:
而在不得不使用 C 时,应该注意使用 extern "C" 这种特性, 将 C 语言的代码与 C++ 代码进行分离编译,再统一链接这种做法。