#define A B 将标识A定义为B的别名 #define 整数 int 整数 a{};
#define H 定义一个标识符H, 代码中的H将会被删除掉 ,int H a => int a; 提高代码可阅读性的
#undef H 删除这个标识符的定义,以后用不了了, 删除的顺序是根据代码编译的顺序进行的。
定义复杂表达式的宏
12345678910111213141516171819202122232425#define _out_#define SUM(X, Y) X+Y*3#define RELEASE(x) delete[] x, x = nullptr;// #define BIGGER(X, Y) (X>Y?X:Y) // (X>Y?X:Y)必须加括号,不然处理不了#define BIGGER(X, Y) ((X)>(Y)?(X):(Y)) // 更保险的方式,全都加上括号#define SHOW(X) std::cout<<X#define ...
此章节干货较少,笔记也比较混乱,理解为主
static 和 inline
静态变量
12345678#include <iostream>int ave(int a, int b){ static int count; // 初始化为0 生命周期跟全局变量一样(局部变量) (不会放在栈上面) std::cout << count ++ << std::endl; return (a + b) / 2;}// 静态变量(无论是局部的还是全局的)通常被存储在 数据段(data segment)中,而不是栈或堆中。静态变量的内存分配在程序启动时就已完成,并且在整个程序运行期间都保持有效,直到程序退出。
内联函数
内联函数(Inline Function)是 C++ 中的一种函数优化技术,它的作用是让编译器将函数的代码直接嵌入到调用该函数的地方,而不是通过函数调用的机制进行跳转。这种 ...
栈的本质是一段提前分配好的内存空间,主要就是用来存放临时变量!只需要管理好栈的读写就可以避免频繁的内存分配和不必要的内存浪费!
123456789101112131415161718int Ave(int a, int b){ a = a + 250; return a + b;}int Add(int a, int b){ int c = 250; int d = Ave(a, b); c = c + d; return c;}int main(){ std::cout << Add; system("pause"); int x = Add(250, 50);}
CPU 的寄存器:
return 的值 一般使用 eax 来传递
函数返回-返回指针和引用返回指针不要返回局部变量123456789101112131415161718#include <iostream>int clen(const char* str){ int i; for (i = 0; str[i]; i ++ ) return ++i;}char* cstr(const char* str){ int len = clen(str); // char strRt[0x20]; // 这就是错误示范,返回了一个局部变量 // 只要不释放,一直在堆上面 char* strRt = new char[len]; memcpy(strRt, str, len); return strRt;}
项目设计
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 ...
函数参数:指针参数
如果需要传递大型数据结构,可以传递指针而不是整个数据结构,避免复制数据。
123456789101112131415#include <iostream>int Add(int* x, int* y){ (*x) *= 100; (*y) *= 10; return (*x) + (*y);}int main(){ int x = 2, y = 1; int c = Add(&x, &y); //x 和 y 的值都改了 指针改的是内存中的数值 std::cout << "c=" << c << "x=" << x << "y=" << y;}
应用
1234567891011121314151617181920212223242526#include <iostream>struct Role{ ...
联合体语法
1234567//示范union USER{ short sHP; int nHP;};// 通过union 可以创建一个联合体,union中的成员变量共享内存,因此union的数据类型大小由其最大的成员变量决定。
实践一下
123456789101112131415161718192021222324252627282930313233343536373839404142// 联合体#include <iostream>union USER{ short sHP; int nHP; double fHP;};union { short sHP; int nHP; double fHP;} ls;// 不重用,临时的 typedef struct Test { short sHP; int nHP; double fHP;};int main(){ // 内存分配 没有初始化 USER user; Test t; std::cout << s ...
数组:
std::array中,可以通过at()来访问数组的内容,如果越界了就会抛出越界异常
数组安全:由于数组的本质是向操作系统申请了一块内存,因此越界的数组将会访问到不该访问的地址,这种越界将会造成程序崩溃,BUG错误,更可怕的是,数组越界漏洞,可能会让攻击者拿到操作系统的控制权。
容器:
12345std::vector<数据类型> 变量名;std::vector<int> s;std::vector<int> s{1,2,3};std::vector<int> s(5); // 设置了5个大小的容器std::vector<int> s(5,100); // 这个容器拥有五个元素,每个元素的初始值为100
容器的几个新用法:
12345678std::vector<int> s;s.push_back(值); //将值添加到容器末尾s.pop_back(); //将末尾的值删除掉s.insert(s.begin()+2, 2); // 在指定位置插入元素s.assign(10, ...
2024.11.11 第一次会议没有回答好的内容:
ASCII、Unicode编码,enum 和 enum class的区别
ASCII、Unicode编码
ASCII码使用指定的7位或者8位二进制数组合来表示128或256种可能的字符。标准的ASCII码使用7位二进制数(剩下一位二进制位0)来表示所有的大写字母和小写字母,数字0-9、标点符号,以及在美式英语中使用的特殊控制字符。最后一位用于奇偶校验。
ASCII是单字节编码,无法用来表示中文,所以中国制定了GB2312编码,把中文编进去。
Unicode:把所有的语言都统一到一套编码里面,这样就不会有乱码的问题。最常用的是用两个字节表示一个字符(偏僻的字符使用4个字节)
UTF8 可变长编码,把一个Unicode字符根据不同的数字大小编码成1-6字节,常用的英文字母被编码成 1个字节,汉字通常是三个字节,只有生僻字才被编码成4-6个字节。传输的文本含有大量英文,使用UTF-8编码就能节省空间。
enum 与 enum class
enum被称为不限定范围的枚举,enum class被称为限定范围的枚举
1️⃣enum ...