Clay 的技术空间

用进废退 | 艺不压身

前言

Linux 中没有 Windows 系统中的 CreateEvent()WaitEvent()SetEvent()ResetEvent() 等函数,本文将介绍如何使用 pevents 替代 Linux 缺失的函数。

pevents 介绍

阅读全文 »

conio.h 头文件

移植简述

conio.h 不是 C 标准库中的头文件,在 ISO 和 POSIX 标准中均没有定义。conio 是 Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如 getch() 函数等等。大部分 DOS、Windows、Phar Lap、DOSX,OS/2 等平台上的 C 编译器提供了此头文件,UNIX 和 Linux 平台的 C 编译器本身通常不包含此头文件。另外在项目开发中,平时主要是使用 conio.h 这个头文件中的 getch() 函数,即读取键盘字符但是不显示出来(without echo),但是含有 conio.h 的代码在 Linux 下无法直接编译通过,因为 Linux 没有这个头文件。但 Linux 平台下完全可以使用 ncurses 替代 conio.h 头文件,ncurses 支持的 API 可以阅读 官方文档。值得一提的是,ncurses 在 Linux 平台实现了 getch()scanw()getstr() 等函数。

阅读全文 »

大纲

string 容器

string 容器的概念

string 是 STL 的字符串类型,通常用来表示字符串。而在使用 string 之前,字符串通常是用 char* 表示的。stringchar* 都可以用来表示字符串,两者的区别如下:

  • string 是一个类,char* 是一个指向字符的指针
  • string 封装了 char* 来管理字符串,本质是一个 char* 类型的容器
  • string 不用考虑内存释放和越界的问题
  • string 负责管理 char* 所分配的内存。每一次 string 的复制,取值都由 string 类负责维护,不用担心复制越界和取值越界等问题
  • string 提供了一系列的字符串操作函数,例如:查找(find)、拷贝(copy)、删除(erase)、替换(replace)、插入(insert)
阅读全文 »

大纲

基本概念

模板的基本概念

模板是实现代码重用机制的一种重要工具,其本质是类型参数化,即把类型定义为参数。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 类库中包含许多用于输入输出的类,如下图所示:

阅读全文 »

大纲

类型转换

类型转换的分类

在 C++ 中,类型转换分为隐式类型转换和显式类型转换,其中显式类型转换有以下 4 种类型:

  • static_cast:静态类型转换,如 int 转换成 char
  • dynamic_cast:动态类型转换,如父类和子类之间的多态类型转换
  • const_cast:常量类型转换,用于赋予或者去除类型的 const 只读属性
  • reinterpreter_cast:重新解释类型(强制类型转换)

静态类型转换

  • static_cast 在编译期进行类型检查,只保证转换合法性,不保证运行时安全性。
  • static_cast 可以用于类层次结构中基类(父类)和派生类(子类)之间指针或者引用的转换。
    • 进行上行转换(将派生类的指针或者引用转换成基类表示)是安全的。
    • 进行下行转换(将基类的指针或者引用转换成派生类表示),由于没有运行时的动态类型检查,所以是不安全的。
  • static_cast 可以用于基本数据类型之间的转换,比如将 int 转化成 char,或者将 char 转换成 int,这种类型转换的安全性需要开发人员来保证。
  • static_cast 只能用于存在类型关系的指针转换(比如继承层次或 void *),不能用于无关类型指针之间的转换(比如 int * 转换为 dubbo *,或者 float * 转换为 dubbo *)。

动态类型转换

  • dynamic_cast 在运行期会基于 RTTI 进行类型检查,但只能用于多态类型(存在虚函数的继承体系中),能保证下行转换的安全性。
  • dynamic_cast 可以用于类层次结构中的上行转换和下行转换,但是不支持基本数据类型的转换。
  • 在类层次结构中进行上行转换(将派生类的指针或者引用转换成基类表示)时,dynamic_caststatic_cast 的效果一样。
  • 在类层次结构中进行下行转换(将基类的指针或者引用转换成派生类表示)时,dynamic_cast 具有运行时类型检查的功能,比 static_cast 更安全。
阅读全文 »

大纲

模板的术语规范

  • 未实例化

    • 类模板(Class Template)‌:未实例化的模板定义,其核心作用是生成具体类的蓝图‌。
    • 函数模板(Function Template)‌:未实例化的模板定义,其核心作用是生成函数族的蓝图‌。
  • 已实例化

    • 模板类(Template Class)‌:类模板实例化后的具体类,由开发人员显式指定模板参数生成‌。
    • 模板函数(Template Function):函数模板实例化后的具体函数,由编译器根据实际调用类型自动生成‌。
阅读全文 »

大纲

智能指针

智能指针的概念介绍

在 C++ 中,智能指针的类型有以下几种:

  • (1) 带引用计数的智能指针:share_ptr
  • (2) 不带引用计数的智能指针:unique_ptrscoped_ptrauto_ptr
  • (3) 特殊的智能指针:weak_ptr(不增加引用计数,但可用于观察 shared_ptr 管理的资源)
智能指针所有权带引用计数适用场景
unique_ptr独占资源独占,生命周期明确
shared_ptr共享资源共享,生命周期不固定
scoped_ptr独占生命周期受限于作用域,适用于简单的场景,避免资源泄漏
weak_ptr观察 shared_ptr避免 shared_ptr 循环引用
auto_ptr独占(拷贝时转移)⚠ 已废弃,建议改用 unique_ptr

unique_ptr 对象的简介

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

阅读全文 »

大纲

前言

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

版本说明

本文使用的各软件版本如下所示:

软件版本默认安装路径说明
C++11
Boost1_77_0C:\Program Files\boost_1_77_0
OpenSSLv1.1.1LC:\Program Files\OpenSSL-Win64
MySQL Connector/C++1.1.13C:\Program Files\MySQL\MySQL Connector C++ 1.1.13
MySQL Server5.7.33MySQL Connector/C++ 支持 MySQL 5.x 和 8.x 版本
Visual Studio2019
Windows SystemWindows 10MySQL Connector/C++ 同时适用于 Linux 和 Windows 系统
阅读全文 »