Clay 的技术空间

用进废退 | 艺不压身

大纲

友元函数

类的友元函数是定义在类的外部,但有权访问类的所有私有(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; ...}
  • 特别注意,宏函数后面的代码不能直接换行,如果代码确实太长,可以使用续行符 \ 换行,如下所示:
阅读全文 »

大纲

const 关键字

提示

const 关键字是 C++ 对 C 语言增强的一部分,详细介绍请看 这里

const 简介

const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量、自定义对象、成员函数、返回值、函数参数等。C++ 的 const 关键字允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某个值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用 const,这样可以获得编译器的帮助。

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using namespace std;

int main() {
const int a = 7;
int *p = (int *) &a;
*p = 8;
cout << a << " "<< *p;
return 0;
}
阅读全文 »

大纲

C++ 简介

C++ 介绍

  • C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
  • C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
  • C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
  • C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的 C,后来在 1983 年更名为 C++。

注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。

阅读全文 »

前言

本文适用于 Debian/Ubuntu、RHEL/Fedora/CentOS、openSUSE/SLE-based、Arch 等 Linux 发行版。

VS Code 安装

Debian / Ubuntu

  • 安装软件仓库源和密钥
1
2
3
4
$ wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
$ sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
$ rm -f packages.microsoft.gpg
  • 更新安装包缓存,并安装 VS Code
1
2
3
$ sudo apt install apt-transport-https
$ sudo apt update
$ sudo apt install code
阅读全文 »

版本说明

  • Hexo 5.4.0
  • NexT 8.8.1

NexT 渲染 Mermaid 绘图

安装 Hexo 插件

在博客的根目录下,执行以下命令安装 hexo-filter-mermaid-diagrams 插件

1
$ npm install hexo-filter-mermaid-diagrams --save
阅读全文 »

日志

定义日志的颜色

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
31
32
33
#!/bin/bash

_COLORS=${BS_COLORS:-$(tput colors 2>/dev/null || echo 0)}
__detect_color_support() {
if [ $? -eq 0 ] && [ "$_COLORS" -gt 2 ]; then
RC='\033[1;31m'
GC='\033[1;32m'
BC='\033[1;34m'
YC='\033[1;33m'
EC='\033[0m'
else
RC=""
GC=""
BC=""
YC=""
EC=""
fi
}
__detect_color_support
echoerror() {
printf "${RC} * ERROR${EC}: %s\\n" "$@" 1>&2;
}
echoinfo() {
printf "${GC} * INFO${EC}: %s\\n" "$@";
}
echowarn() {
printf "${YC} * WARN${EC}: %s\\n" "$@";
}

# 使用示例
echoinfo "Hello World"
echowarn "Hello World"
echoerror "Hello World"
阅读全文 »

什么是 Swap

Linux 中的 Swap 即为系统交换区,类似于 Windows 的虚拟内存,当内存不足的时候,把一部分磁盘空间虚拟成内存使用,以解决内存容量不足的情况。Linux 系统的内存管理必须使用交换区来建立虚拟内存。尽管对于交换空间的合适大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。通常,等于或两倍于系统 RAM 量的量是一个很好的起点。另一个好的经验法则是,如果您只是将它用作 RAM 后备,那么任何超过 4G 的交换空间都可能是不必要的。

创建交换分区

  • 查看交换分区信息
1
sudo swapon -s
  • 查看系统内存大小
1
sudo free -m
阅读全文 »