1.1 Deprecated Features
Deprecation并不是完全不可用的,它只是暗示一些特性将从未来的标准中消失,应该避免使用。然而,不赞成使用的特性仍然是标准库的一部分,而且大多数特性实际上是“永久”保留的,这是出于兼容性的原因。
如果你从未使用或听说过下面的一些标准,请不要试图去理解它们。您应该直接学习新特性
-
字符串常量不再允许分配给char *。如果您需要用一个字符串常量来分配和初始化一个char *,您应该使用const char *或auto。
char *str = "hello world!"; // A deprecation warning will appear
-
c++ 98异常描述、beforeted_handler、set_unexpected()和其他相关特性不推荐使用,应该使用noexcept。
-
auto_ptr不使用,应该使用unique_ptr。
-
register关键字已被弃用,可以使用,但不再具有任何实际意义。
-
bool类型的++操作弃用
-
如果某个类有析构函数,那么这个类为其生成复制构造函数和复制赋值操作符的特性不赞成使用。(临时类瓜皮了???)
-
弃用C语言风格类型转换(即使用(convert_type))变量之前, 而应该用static_cast reinterpret_cast, const_cast来类型转换。
-
特别是一些C标准库中弃用,可以使用最新的c++ 17标准,如< ccomplex >, < cstdalign >, < cstdbool >和< ctgmath >
-
……其他
还有其他一些特性,如参数绑定(c++ 11提供了std::bind和std::function)、export 等,也不推荐使用。
1.2 Compatibilities with C
由于一些不可抗力和历史原因,我们不得不在c++中使用一些C代码(甚至是旧的C代码),例如Linux系统调用。在现代c++出现之前,大多数人都在谈论“C和c++之间的区别”。一般来说,除了回答泛型编程的面向对象类特性和模板特性之外,没有其他的意见,甚至没有直接的答案。“差不多”也是很多人。图1.2中的维恩图大致回答了C和c++相关兼容性的问题。
从现在开始,你的脑海中应该有这样的想法:“c++不是C的超集”(而不是从一开始,在后面参考进一步阅读给出了c++ 98和C99之间的区别)。在编写c++时,你也应该尽可能避免使用像void*这样的程序风格。当你必须使用C时,你应该注意extern “C”,将C语言代码从c++代码中分离出来,然后统一链接:
// foo.h
#ifdef __cplusplus
extern "C" {
#endif
int add(int x, int y);
#ifdef __cplusplus
}
#endif
// foo.c
int add(int x, int y) {
return x+y;
}
// 1.1.cpp
#include "foo.h"
#include <iostream>
#include <functional>
int main() {
[out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){
out.get() << ".\n";
}();
return 0;
}
上述代码分别用gcc和c++编译器来编译,然后统一链接。