Clay 的技术空间

用进废退 | 艺不压身

大纲

模板的术语规范

  • 未实例化

    • 类模板(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.33
Visual Studio2019
Windows SystemWindows 10
阅读全文 »

大纲

多态的原理

多态的实现原理

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

大纲

多继承

多继承概念

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

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

阅读全文 »

大纲

继承概念

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

类之间的关系

类之间一般有三种关系:

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

大纲

友元函数

类的友元函数是定义在类的外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型在类的声明中出现过,但是友元函数并不是类的成员函数,而是普通函数(全局函数)。如果要声明函数为一个类的友元函数,则需要在类定义中的函数原型前面使用关键字 friend

友元函数的规则

C++ 利用 friend 修饰符,可以让一些设定的函数能够对类中的一些保护数据进行访问,避免把类的成员全部设置成 public,并且最大限度的保护数据成员的安全。同时友元函数可以实现类之间的数据共享,减少系统开销,提高效率。由于友元函数破环了封装机制,因此推荐尽量使用成员函数,除非不得已的情况下才使用友元函数。

阅读全文 »

大纲

explicit 关键字

explicit 介绍

在 C++ 中,explicit 关键字用于声明类的单参数构造函数为显式构造函数,防止其被隐式调用。简而言之,explicit 可以显式地禁止类构造函数的隐式转换,这样可以避免一些意外的类型转换和编译器自动调用构造函数的情况。

使用注意事项

  • explicit 关键字只能用于类内部的构造函数声明上。
  • explicit 关键字作用于单个参数的构造函数。
阅读全文 »

大纲

类和对象

基本概念

  • (a) 类、对象、成员变量、成员函数
  • (b) 面向对象四大概念:封装、继承、多态、抽象

类的封装

封装(Encapsulation):

  • (a) 封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,对数据和函数进行访问控制,这在计算机世界中是用类与对象实现的。
  • (b) 封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

C++ 中类的封装:

  • 成员变量:C++ 中用于表示类属性的变量
  • 成员函数:C++ 中用于表示类行为的函数
阅读全文 »

大纲

C 语言中的宏函数

宏函数的定义

  • 宏函数的定义语法:#define 宏名(a, b, c, ...) a + b * c
  • 如果宏函数后面的代码有多行,可以使用大括号包裹,如 #define 宏名(a, b, c, ...) {代码1; 代码2; ...}
  • 特别注意,宏函数后面的代码不能直接换行,如果代码确实太长,可以使用续行符 \ 换行,如下所示:
阅读全文 »