实现一个简单的字符串类

MyString.h #ifndef __MYSTRING_H_ #define __MYSTRING_H_ #include <stdlib.h>#include <iostream>#include <cstring> using namespace std; class MyString { // 重载 << // 最好是 const 的,可以输出匿名变量(匿名变量不能被非 const 的左值引用接收) friend ostream& operator<<(ostream &os, const MyString &s); // 重载 >> friend istream& operator>>(istream &is, MyString &s); private: // 字符串的有效长度 int m_len; // 字符串指针 char* m_pStr; public: MyString(); MyString(const char *); MyString(const MyString &); ~MyString(); // 重载 = MyString& operator=(const MyString &); // 重载 [] char& operator[](int index); // 重载 + MyString operator+(const MyString &); // 重载 += MyString& operator+=(const MyString &); // 重载 == bool operator==(const MyString &); // 重载 !...

January 8, 2022 · 3 min · Rick Cui

静态数组初始化

1. 声明静态数组后一定要进行初始化,否则里面的值都是未知的 int main() { int ia[3] = {0}; // 这虽然只是给第一个元素赋了值,但剩余未赋值的元素都会初始化为0 char ca[3] = {0}; double da[3]; bool ba[3]; short sa[3]; float fa[3]; for(auto & i : da){ cout << i << endl; } return 0; } 输出: 6.95128e-310 4.63759e-310 0 2. C++ 数组指针和数组类型 数组类型和数组指针(数组名)不是一种类型,只是恰好指向的地址相同而已 数组名是指针常量(int * const),代表数组中第一个元素的地址 数组类型代表整个数组 int main() { int arr[10]; cout << arr << endl; cout << arr + 1 << endl; cout << "----------" << endl; cout << &arr << endl; cout << &arr + 1 << endl; return 0; } 输出:...

January 8, 2022 · 2 min · Rick Cui

VS Code 搭建 c++ gdb 开发环境

一、安装 C++ 开发环境 Using GCC with MinGW 安装 MSYS2 更新 MSYS2 pacman -Syu 在开始菜单中运行 MSYS2 MSYS,更新其余的基本包 pacman -Su 安装 C++ 开发环境: clang++ x64 gdb: pacman -S --needed base-devel mingw-w64-ucrt-x86_64-clang mingw-w64-ucrt-x86_64-gdb g++ gdb: pacman -S --needed base-devel mingw-w64-x86_64-toolchain clang++ lldb: pacman -S --needed base-devel mingw-w64-clang-x86_64-lldb 这个库会把 clang clang++ 等库安装到 msys64/clang64/bin 目录,但是 lldb 在 Windows 上的调试效果不如 gdb clang++ x86:pacman -S --needed base-devel mingw-w64-i686-clang 添加环境变量 D:\msys64\ucrt64\bin 检查是否安装成功 clang++ --version g++ --version gdb --version pacman -Syu // 更新整个系统 pacman -Su // 更新已安装的包 pacman -Ss 关键字 // 搜索含关键字的包 pacman -S 包名 // 安装包,也可以同时安装多个包,只需以空格分隔包名即可 pacman -Rs 包名 // 删除包及其依赖 pacman -R 包名 // 删除包 二、配置 VS Code 主要是修改 task....

January 6, 2022 · 2 min · Rick Cui

C++ 内存对齐

C/C++内存对齐详解 内存对齐规则 对齐系数(也叫对齐模数):gcc中默认 #pragma pack(4),可以通过预编译命令 #pragma pack(n),n = 1,2,4,8,16 来改变这一系数 有效对齐值:是给定值 #pragma pack(n) 和结构体中 最长数据类型长度中较小的那个。有效对齐值也叫 对齐单位 规则一:结构体第一个成员的偏移量 offset 为 0,以后每个成员相对于结构体首地址的 offset 都是该成员大小与有效对齐值中较小那个的整数倍,如有需要编译器会在成员之间加上填充字节 规则二:结构体的总大小为 有效对齐值 的整数倍,如有需要编译器会在最末一个成员之后加上填充字节 注意:上面两条规则都需要得到满足 注意:成员变量首地址偏移和对齐都是与【有效对齐值】进行比较,而有效对齐值是对齐系数与结构体中最长数据类型中的较小者 // 64 位程序 struct { int i; char c1; char c2; }x1; struct{ char c1; int i; char c2; }x2; struct{ char c1; char c2; int i; }x3; struct { short i; char c1; char c2; }y1; struct{ char c1; short i; char c2; }y2; struct{ char c1; char c2; short i; }y3; int main() { printf("%ld\n",sizeof(x1)); // 输出8 printf("%ld\n",sizeof(x2)); // 输出12 printf("%ld\n",sizeof(x3)); // 输出8 cout << "----------------" << endl; printf("%ld\n",sizeof(y1)); // 输出4 printf("%ld\n",sizeof(y2)); // 输出6 printf("%ld\n",sizeof(y3)); // 输出4 return 0; } 既要考虑首地址偏移,又要是有效对齐值(对齐单位)的整数倍 y1 y2 y3结构体:...

January 6, 2022 · 1 min · Rick Cui

自定义智能指针

使用模板类 重载 -> 操作符 重载 * 操作符 template<typename T> class MyAutoPtr{ public: MyAutoPtr(T * t){ ptr = t; } ~MyAutoPtr(){ if(ptr != NULL){ delete ptr; ptr = NULL; } } T* operator->(){ // 相当于 ptr-> , 所以返回 ptr 指针即可,将所有操作转发给真正的指针变量 return ptr; } T& operator*(){ // 相当于 (*ptr) ,所以返回 ptr 指向的对象引用即可 return *ptr; } private: T* ptr; }; class A{ public: A(int a){ cout << "A(int)..." << endl; this->a = a; } ~A(){ cout << "~A()....

January 4, 2022 · 1 min · Rick Cui