掌握 Effective C++ : 条款01

2023-11-19

背景

《Effective C++》 是每个 C++ 程序员都应该读的经典之作,书中涵盖了 C++ 编程中的一系列最佳实践,包括了面向对象设计、模板、STL、异常处理等方面的内容。

由于 C++ 的发展非常迅速,书中的某些内容可能已经过时,但依然是值得好好学习的一本书。通过本书的阅读,读者能够掌握 C++ 编程的精髓,写出高效且健壮的代码。

本系列文章会对书中每项条款进行整理,以便在未来想要回顾某一条款的内容时可以最大限度地节约时间。
条款 01:建议将C++视为一个语言联邦

C++的多种编程范式

概述

C++ 是一个多范式语言,支持面向过程、面向对象、泛型编程等多种编程范式。

面向过程编程

以过程为中心,强调程序的执行过程,使用函数进行模块化设计,侧重于数据的流程化处理。

#include <iostream>
void printHelloWorld()
{
    std::cout << "Hello, World!" << std::endl;
}
int main()
{
    printHelloWorld();
    return 0;
}

面向对象编程

以对象为中心,强调程序的结构和数据的封装,使用类进行模块化设计,侧重于数据的抽象和封装。

#include <iostream>
class HelloWorld
{
public:
    void print()
    {
        std::cout << "Hello, World!" << std::endl;
    }
};
int main()
{
    HelloWorld hw;
    hw.print();
    return 0;
}

泛型编程

以模板为中心,强调程序的通用性和灵活性,使用参数化类型进行模块化设计,侧重于算法的抽象和泛化。

#include <iostream>
#include <vector>
template<typename T>
void printVector(const std::vector<T>& vec)
{
    for (const auto& elem : vec)
    {
        std::cout << elem << " ";
    }
    std::cout << std::endl;
}
int main()
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    printVector(vec);
    return 0;
}

元编程

以编译时计算为中心,强调程序的元信息的处理和计算,使用模板元编程进行模块化设计,侧重于编译期间的计算和优化。

#include <iostream>
#include <type_traits>

template<typename T>
struct is_pointer : std::false_type {};

template<typename T>
struct is_pointer<T*> : std::true_type {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << is_pointer<int>::value << std::endl; // false
    std::cout << is_pointer<int*>::value << std::endl; // true
    return 0;
}

C++ 的四个次语言

概述

条款 01 建议将C++视为一个语言联邦,在不同的领域中使用不同的"子语言"。

C 语言子集

C++ 支持 C 语言的大部分语法和功能,可以直接使用C语言的代码。

#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}

对象基础子集

C++ 支持类、对象、继承等面向对象编程的概念,可以使用C++的面向对象特性进行编程。

#include <iostream>

class Person {
public:
    Person(std::string name, int age)
            : name_(name), age_(age) {}

    void say_hello() {
        std::cout << "Hello, I'm " << name_ << ", " << age_ << " years old." << std::endl;
    }

private:
    std::string name_;
    int age_;
};

int main() {
    Person p("John", 25);
    p.say_hello();
    return 0;
}

模板子集

C++ 支持模板编程,可以使用模板实现泛型编程,提高代码的复用性和可扩展性。

#include <iostream>
#include <vector>
#include <algorithm>

template<typename T>
void print_vec(const std::vector<T>& vec) {
    for (const auto& i : vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> v{1, 2, 3, 4, 5};
    print_vec(v);

    std::transform(v.begin(), v.end(), v.begin(), [](int i) { return i * 2; });
    print_vec(v);

    return 0;
}

STL 子集

C++ 标准库中提供了许多高效、通用的数据结构和算法,可以使用 STL 进行编程。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v{1, 2, 3, 4, 5};

    auto is_even = [](int i) { return i % 2 == 0; };
    std::cout << std::count_if(v.begin(), v.end(), is_even)
              << std::endl;

    return 0;
}

总结

将 C++ 视为一个语言联邦的好处在于,我们可以根据具体的需求和场景,选择最适合的子语言来编写程序。
比如:如果我们需要编写高性能的代码,可以使用 C 语言来实现;如果我们需要使用面向对象的编程方式,可以使用 Object-Oriented C++;如果我们需要实现泛型编程,可以使用 Template C++;如果我们需要使用现成的数据结构和算法,可以使用 STL 等。

微信搜索“编程猿来如此”,关注公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握 Effective C++ : 条款01 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • VS中报错IntelliSense: argument of type "void *" is incompatible with parameter of type "const char *"

    在用VS编写C 程序的时候 遇到这样的问题IntelliSense argument of type void is incompatible with parameter of type const char 但是给的例程确实传入参数就是
  • ListView的操作

    转自http blog sina com cn s blog 43eb83b90100mhrs html 这一篇对我也不错http blog csdn net xiaohan2826 article details 8603015 小白叔叔
  • PCIe 5.0 规范最新更新及PCIe 5.0测试挑战​

    PCIe 5 0 基础规范 v1 0 在 2019 年年中发布以后 Synopsys 发布了世界上第一款支持 PCIe 5 0 基础规范 v1 0 的 IP 并展示了在其实验室验证发射机 接收机 Tx Rx 性能的环境 Intel 也在 2
  • 基于MATLAB手写体数字识别程序设计

    基于MATLAB手写体数字识别程序设计 手写体识别由于其实用性 一直处于研究进步的阶段 本文主要针对的是对0 9十个手写数字体脱机识别 在Matlab中对样本部分为进行16特征的提取 分别采用最小距离法 最近邻法 KNN法以及BP神经网络算
  • UNIX网络编程-recv、send、read、write之间的联系与区别

    原文链接 http www cnblogs com mhscn p 3911284 html include
  • 在centos7中安装docker

    一 前置条件 64 bit 系统 kernel 3 10 CentOS 7 1 检查 使用 uname r 检查 kernel 版本 uname r 3 10 0 327 el7 x86 64 二 安装 yum安装方式 1 使用 sudo
  • Hdfs下载报错,(null) entry in command string: null chmod 0644问题的解决

    解决 缺少系统文件hadoop dll文件 1 下载hadoop dll文件 2 把文件放在 windows system32目录下
  • python 根据年份,月份信息显示此月份天数

    1 普通方法 2 year int input 请输入年份 3 month int input 请输入月份 1 12 4 if month 2 5 if year 4 0 and year 100 0
  • Qt QtCreator 所有版本官方下载地址

    直接跳过输入账号 选择所需版本 废话不多说 直接上链接 1 所有版本QT下载地址 http download qt io archive qt 2 所有Qt Creator下载地址 http download qt io archive q
  • Unity知识点详解面试题大全

    1 请简述值类型与引用类型的区别 答 区别 1 值类型存储在内存栈中 引用类型数据存储在内存堆中 而内存单元中存放的是堆中存放的地址 2 值类型存取快 引用类型存取慢 3 值类型表示实际数据 引用类型表示指向存储在内存堆中的数据的指针和引用
  • tinystl实现(第二十步:string实现)

    经过长时间的学习终于可以开始tinystl的仿 chao 写工作了 本文参考了这位大神的github 坦白讲我只是补充了注释 因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验 所以只能这样做 不过相信能够有助于大家的学习
  • Windows脚本对最后修改时间超过24小时的文件进行处理

    这次我接到一个任务 是写一个windows上运行的脚本 讲某个文件夹下最后修改时间超过24小时的文件移到另一个文件夹 然后在判断有生成的文件超过十分钟的关闭一个程序再启动它 上网搜了一下 有很多相关的 比如说把最后修改时间的文件超过一天的删
  • 第一章 开发环境的配置

    1 1 操作系统的选择 常见的操作系统有 Windows Linux 和maxOS 大部分生产环境所用到的操作系统是Liunx 这使得它具有天然的开发优势 本书也将使用Linux操作系统作为学习环境 书中大部分软件安装 环境配置和案例将以L
  • 设计randompool结构

    哈希表是get每一个key的value 而本题没有value 只有key 我们准备两张哈希表 以及一个变量 size 一个表存放某 key 的标号 另一个表根据根据标号取某个key 如下图所示 A是第0个进来的 B是第二个进来的 我们现在先
  • 仿中国婚博会微信小程序

    仿中国婚博会微信小程序 app json pages pages index index pages cash cash pages marry marry pages community community pages me me pag
  • react 全局挂载组件

    在index js 文件中导入react需要挂载的组件 import message from antd 全局挂载组件 React message function arg 默认部分参数 const type success content
  • js一道this笔试题

    JS this阿里笔试面试题 代码 1 this 谁调用就指向谁 2 在对象中this为对象本身 3 直接调用this为window var name 222 var a name 111 say function console log
  • 如何在Debian(kali)中配置代理(agent)服务器?

    开始搭建代理服务器 首先我参考如下文章进行搭建代理服务器 步骤每一个命令都执行过报了各种错 找了博客 目前尚未开始 我已经知道我的路很长 很难走呀 加油 go go go 第一个教程 第二个教程 Ubuntu Debian CentOS搭建
  • MySQL数据查询 - 简单查询

    简单查询 在MySQL中可以通过SQL语句来实现基本数据查询 SQL语句可以通过如下多种使用 查询所有字段数据 查询指定字段数据 避免重复数据查询 对结果进行排序和分组等查询 数据库中可能包含数量庞大的表 表中可能包含无数的记录 如果没有两
  • 掌握 Effective C++ : 条款01

    背景 Effective C 是每个 C 程序员都应该读的经典之作 书中涵盖了 C 编程中的一系列最佳实践 包括了面向对象设计 模板 STL 异常处理等方面的内容 由于 C 的发展非常迅速 书中的某些内容可能已经过时 但依然是值得好好学习的