Clay 的技术空间

用进废退 | 艺不压身

大纲

基本概念

模板的基本概念

模板是实现代码重用机制的一种重要工具,其本质是类型参数化,即把类型定义为参数。C++ 提供了类模板和函数模板,详细的使用可参考教程:C++ 进阶基础之二

类模板的简介

  • 类模板的本质就是建立一个通用类,其成员变量的类型、成员函数的返回类型和参数类型都可以不具体指定,而用虚拟的类型来替代
  • 当使用类模板建立对象时,编译器会根据实参的类型取代类模板中的虚拟类型,从而实现不同类的功能

函数模板的简介

  • 函数模板就是建立一个通用的函数,其函数返回类型和形参类型不具体指定,而是用虚拟的类型来替代
  • 凡是函数体相同的函数都可以用函数模板来代替,不必定义多个函数,只需在模板中定义一次即可
  • 在调用函数时,编译器会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能
阅读全文 »

大纲

标准 I/O 流的介绍

I/O 流的概念

程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++ 的输入输出包含以下三个方面的内容:

  • 对系统指定的标准设备的输入和输出:即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称 标准 I/O
  • 以外存磁盘文件为对象进行输入和输出:即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称 文件 I/O
  • 对内存中指定的空间进行输入和输出:通常指定一个字符数组作为存储空间(实际上可以利用该内存空间存储任何信息)。这种输入和输出称为字符串输入输出,简称 串 I/O

I/O 流类库的结构

在 C 语言中,用 printfscanf 进行输入输出,往往不能保证所输入输出的数据是可靠的安全的。在 C++ 的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此 C++ 的 I/O 操作是类型安全(Type Safe)的。C++ 的 I/O 操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。C++ 通过 I/O 类库来实现丰富的 I/O 功能。这样使 C++ 的输人输出明显地优于 C 语言中的 printfscanf,但是也为之付出了代价,C++ 的 I/O 系统因此变得比较复杂,要掌握许多使用细节。C++ 编译系统提供了用于输入输出的 iostream 类库。iostream 这个单词是由 3 个部分组成的,即 i-o-stream,意为输入输出流。在 iostream 类库中包含许多用于输入输出的类,如下图所示:

阅读全文 »

大纲

类型转换

类型转换的分类

静态类型转换

  • static_cast 可以用于类层次结构中基类(父类)和派生类(子类)之间指针或者引用的转换。
    • 进行上行转换(将派生类的指针或者引用转换成基类表示)是安全的。
    • 进行下行转换(将基类的指针或者引用转换成派生类表示),由于没有动态类型检查,所以是不安全的。
  • static_cast 可以用于基本数据类型之间的转换,比如将 int 转化成 char,或者将 char 转换成 int,这种类型转换的安全性需要开发人员来保证。

动态类型转换

  • dynamic_cast 可以用于类层次结构中的上行转换和下行转换,但是不支持基本数据类型的转换。
  • 在类层次结构中进行上行转换(将派生类的指针或者引用转换成基类表示)时,dynamic_caststatic_cast 的效果一样。
  • 在类层次结构中进行下行转换(将基类的指针或者引用转换成派生类表示)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。
阅读全文 »

大纲

函数模板和类模板

C++ 提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

cplus-plus-template-1

阅读全文 »

大纲

智能指针

智能指针的入门案例

unique_ptr 对象的介绍

unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针。unique_ptr 对象包装了一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。unique_ptr 实现了 ->* 运算符的重载,因此它可以像普通指针一样使用。

阅读全文 »

前言

本文将介绍 C++ 如何使用 MySQL Connector/C++ 的 API 连接 MySQL 数据库,适用于 Windows 系统。

版本说明

软件版本默认安装路径
MySQL Connector/C++1.1.13C:\Program Files\MySQL\MySQL Connector C++ 1.1.13
OpenSSLv1.1.1LC:\Program Files\OpenSSL-Win64
boost1_77_0C:\Program Files\boost_1_77_0
MySQL Server5.7.33
C++11
Visual Studio2019
Windows SystemWin 10
阅读全文 »

大纲

多态的原理

多态的实现原理

  • 当类中声明了虚函数时,编译器会在类中生成一个虚函数表
  • 虚函数表是一个存储类成员函数指针的数据结构
  • 虚函数表是由编译器自动生成和维护的
  • 虚函数(virtual)会被编译器放入虚函数表中
  • 当存在虚函数时,每个对象中都有一个指向虚函数表的指针(C++ 编译器给父类对象、子类对象提前设置了 VPTR 虚函数表指针,因此 C++ 编译器不需要区分子类对象或者父类对象,只需要在 base 指针中,找 VPTR 指针即可)
  • VPTR 虚函数表指针一般作为类对象的第一个成员
阅读全文 »

大纲

多继承

多继承概念

  • (a) 一个类有多个直接基类(父类)的继承关系称为多继承

  • (b) 类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加自己的成员

阅读全文 »

大纲

继承概念

面向对象程序设计有 4 个主要特点:抽象、封装、继承和多态。面向对象程序设计的两个重要特征一数据抽象与封装,两者已经能够设计出基于对象的程序,这是面向对象程序设计的基础。要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特征 —— 继承和多态。继承是面向对象程序设计最重要的特征,可以说,如果没有掌握继承,就等于没有掌握类和对象的精华,就是没有掌握面向对象程序设计的真谛。

类之间的关系

类之间一般有三种关系:

  • has-A:包含关系,用以描述一个类由多个 “部件类” 构成。实现 has-A 关系可以用类成员表示,即一个类中的数据成员是另一种已经定义的类。
  • uses-A:一个类部分地使用另一个类。类之间成员函数的联系,可以通过定义友元或者对象参数传递来实现。
  • is-A:机制称为 “继承” 。关系具有传递性,不具有对称性。
阅读全文 »