0%

类型转换

类型转换的语法

  • C 语言风格的强制类型转换(Type Cast)很简单,不管什么类型的转换,语法都是:TYPE b = (TYPE) a

  • C++ 风格的类型转换,提供了 4 种类型转换操作符来应对不同场合的应用

    • const_cast:去除变量的 const 只读属性
    • reinterpreter_cast:重新解释类型(强制类型转换)
    • static_cast:静态类型转换,如 int 转换成 char
    • dynamic_cast:动态类型转换,如父类和子类之间的多态类型转换
  • C++ 4 种类型转换的语法:TYPE B = static_cast<TYPE> (a)

阅读全文 »

函数模板和类模板

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

cplus-plus-template-1

阅读全文 »

智能指针

智能指针的入门案例

unique_ptr 对象的介绍

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

unique_ptr 对象的简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>

using namespace std;

class Task {

public:
Task(int id) {
this->id = id;
cout << "构造函数被调用" << endl;
}

~Task() {
cout << "析构函数被调用" << endl;
}

int getId() {
return this->id;
}

private:
int id;

};

int main() {
unique_ptr<Task> taskPtr(new Task(23));
cout << "id = " << taskPtr->getId() << endl;
return 0;
}
阅读全文 »

前言

本文将介绍 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-Auses-Ais-A

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

查找文件

查找源文件

1
2
3
4
5
6
7
8
# 查找 src 目录下的所有源文件,并保存到 SOURCE_FILES 变量
aux_source_directory(src SOURCE_FILES)

# 查找 src 目录下所有以 .cpp 开头的文件,并保存到 SOURCE_FILES 变量
file(GLOB SOURCE_FILES "src/*.cpp")

# 递归查找 src 目录下所有以 .cpp 开头的文件,并保存到 SOURCE_FILES 变量
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp")
阅读全文 »

友元函数

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

友元函数的规则

为什么要引入友元函数:

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

什么时候使用友元函数:

  • 多个类要共享数据的时候
  • 运算符重载的某些场合需要使用友元函数
阅读全文 »

浅拷贝与深拷贝

  • C++ 提供的默认拷贝构造函数,可以完成对象的数据成员值简单的复制(浅拷贝)
  • 对象的数据资源是由指针指向的堆,C++ 提供的默认拷贝构造函数仅作指针值复制(浅拷贝)

浅拷贝问题剖析

阅读全文 »