重走C++之路(1)

244 阅读2分钟

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语言

兼容性如图所示:

image.png

而在不得不使用 C 时,应该注意使用 extern "C" 这种特性, 将 C 语言的代码与 C++ 代码进行分离编译,再统一链接这种做法。