第 1 章 迈向现代 C++ 现代 C++ 教程: 高速上手 C++ 11/14/17/20

您所在的位置:网站首页 编程快速上手教程 第 1 章 迈向现代 C++ 现代 C++ 教程: 高速上手 C++ 11/14/17/20

第 1 章 迈向现代 C++ 现代 C++ 教程: 高速上手 C++ 11/14/17/20

2024-07-14 15:08| 来源: 网络整理| 查看: 265

第 1 章 迈向现代 C++

编译环境:本书将使用 clang++ 作为唯一使用的编译器,同时总是在代码中使用 -std=c++2a 编译标志。

> clang++ -vApple LLVM version 10.0.1 (clang-1001.0.46.4)Target: x86_64-apple-darwin18.6.0Thread model: posixInstalledDir: /Library/Developer/CommandLineTools/usr/bin 1.1 被弃用的特性

在学习现代 C++ 之前,我们先了解一下从 C++11 开始,被弃用的主要特性:

注意:弃用并非彻底不能用,只是用于暗示程序员这些特性将从未来的标准中消失,应该尽量避免使用。但是,已弃用的特性依然是标准库的一部分,并且出于兼容性的考虑,大部分特性其实会『永久』保留。

不再允许字符串字面值常量赋值给一个 char *。如果需要用字符串字面值常量赋值和初始化一个 char *,应该使用 const char * 或者 auto。

char *str = "hello world!"; // 将出现弃用警告

C++98 异常说明、 unexpected_handler、set_unexpected() 等相关特性被弃用,应该使用 noexcept。

auto_ptr 被弃用,应使用 unique_ptr。

register 关键字被弃用,可以使用但不再具备任何实际含义。

bool 类型的 ++ 操作被弃用。

如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。

C 语言风格的类型转换被弃用(即在变量前使用 (convert_type)),应该使用 static_cast、reinterpret_cast、const_cast 来进行类型转换。

特别地,在最新的 C++17 标准中弃用了一些可以使用的 C 标准库,例如 、、 与 等

……等等

还有一些其他诸如参数绑定(C++11 提供了 std::bind 和 std::function)、export 等特性也均被弃用。前面提到的这些特性如果你从未使用或者听说过,也请不要尝试去了解他们,应该向新标准靠拢,直接学习新特性。毕竟,技术是向前发展的。

1.2 与 C 的兼容性

出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代码),例如 Linux 系统调用。在现代 C++ 出现之前,大部分人当谈及『C 与 C++ 的区别是什么』时,普遍除了回答面向对象的类特性、泛型编程的模板特性外,就没有其他的看法了,甚至直接回答『差不多』,也是大有人在。图 1.2 中的韦恩图大致上回答了 C 和 C++ 相关的兼容情况。

图 1.2: C 和 C++ 互相兼容情况

从现在开始,你的脑子里应该树立『C++ 不是 C 的一个超集』这个观念(而且从一开始就不是,后面的进一步阅读的参考文献中给出了 C++98 和 C99 之间的区别)。在编写 C++ 时,也应该尽可能的避免使用诸如 void* 之类的程序风格。而在不得不使用 C 时,应该注意使用 extern "C" 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:

// foo.h#ifdef __cplusplusextern "C" {#endifint add(int x, int y);#ifdef __cplusplus}#endif// foo.cint add(int x, int y) { return x+y;}// 1.1.cpp#include "foo.h"#include #include int main() { [out = std::ref(std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3