C++
文章平均质量分 50
普世的微光
不学就不会 学了可能会 多学一定会
泯顽不灵 我欲与天
展开
-
c++之说_14|左值引用与右值引用
这样的函数 是有隐患的 我的本意是 这个返回值是即将销毁的值 然而外部可修改。我们也看到了引用是可以直接修改对象的 所以也是会有点问题 有些人不按照规则来。你不知道传进来的这个对象是 const 修饰的对象 还是 要表示的销毁对象。我的理解就是告诉我们 这个值是要销毁的 推荐使用一个新对象去存储。右值引用的右值引用 才是右值引用 其余都为左值引用。记住有名字的右值引用 是左值 所以可以取地址。对左值引用取地址 所取的是引用对象的地址值。由于是引用 当然可以改变所引用的对象。原创 2024-02-11 14:51:32 · 576 阅读 · 0 评论 -
c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)
enum 被称为无作用域枚举 , enumclass / enumstruct 被称为有作用域枚举。所以c++引入了enumclass / enumstruct 有作用域枚举。你会问 要是我用一个不存在于枚举里面的数 去强制转换为枚举会如何?无作用域枚举 定义以后可以直接访问到成员 仿佛是全局变量一般。这个是什么 它可以指定枚举的内存使用的大小。int ki = k;无作用域枚举 可以隐式转换到数值型。看下面的数 是上面数加1吧?原创 2024-02-10 18:22:06 · 441 阅读 · 0 评论 -
c++之说_13|模板 折叠表达式
调用处 call(integer_sequence());这个可以说就是 把 ... 左边的 成一个整体 get(_tuple)// return ((5*10)+...+ints);要根据 形参包实际的参数 ints 去调用并 铺开成为。从这里我们也可以看出 lambda 本质是是一个类里面。这是这里说的几种 实际上并还有一些写法。不和我们平时调用的一样。原创 2024-02-08 12:17:43 · 367 阅读 · 0 评论 -
c++之说_12|模板
我们看到 Tuple_text<int, char, float, long> 类里面有所有的 val。但是 继承的 父类 Tuple_text<char, float, long> 的 val。Tuple_text<int, char, float, long> 的 val 很简单。这就是模板特化的一部分特性 注意 特化版本的模板形参与主模版的模板形参并无瓜葛。看就显示实例化了没用到的 Obj 模板形参 我们人看上去也是可推导的。不限个数的啊 超过两个的形参 统统进入形参包。原创 2024-02-07 23:06:15 · 846 阅读 · 0 评论 -
c++之说_10|自定义类型 union 联合体
我们可以发现 union u1Obj.o = 0xFFFFFFFFFF;是直接写在了第一行 写了四个字节。给的数值是5个字节的却只写了四个字节。看到没 union 内存大小是 8 struct的内存大小是:24 同样的内部成员。union内部的成员变量的内存都是共用同一块的 大小一般是 内部成员最大的那个个。因为 o 这个变量是 int 型的 大小就是4字节 超出的就截掉了。union 类型名 { 内部成员 } 定义时实例的对象;左边是union的 右边是 struct的。原创 2024-02-05 17:26:21 · 800 阅读 · 0 评论 -
c++之说_9_5|自定义类型 struct 析构函数
/error 使用了B 的无参构造函数 但是B中没有 无参构造函数。// 函数结束 销毁函数栈中的栈变量 cobj 被销毁。// 函数结束 销毁函数栈中的栈变量 cobj 被销毁。注意 new 实例类型变量时 返回的是堆空间中的地址值 需要使用指针存储。//ok 使用了B 的有参函数。//归还堆空间 销毁该B类型的对象。//这里我感觉其实应该放调用类型的构造函数。delete 掉 C类型构造函数中的 new 出来的地址值。它是对象销毁时进行自动调用的 一般是拿来做清理工作的。原创 2024-01-24 17:32:45 · 381 阅读 · 0 评论 -
c++之说_9_5|自定义类型 struct 构造函数
/ 或者 new A1 在堆空间 error 无法为该类型实例变量 因为 无参构造函数是 protected 外部无权访问。// 或者 new A 在堆空间 实例一个A类型对象变量并返回地址 使用的是 无参构造函数。//实例一个A类型名为 a1 的对象变量 使用的是 有参构造函数 A(int a)// 在堆空间 实例一个A类型对象变量并返回地址 使用的是。//实例一个A类型名为 a 的对象变量 使用的是 无参构造函数。使用有参构造函数 A1(const char* a)原创 2024-01-24 02:44:47 · 471 阅读 · 0 评论 -
c++之说_9_4|自定义类型 struct 访问修饰符
aPre = 102;//error 在父类 A 中 该 aPre 变量是 private 的 所以子类无权访问 只能在A自己的内部访问 同样我们也可以间接。struct B: public A // 继承写法 继承 其实就是 子类直接拥有了A 中的一切 函数 变量 typedef 的类型别名 using 的类型别名。//error aPr变量是protected 的 类的外部不可以通过实例对象访问。//error aPre变量是private 的 类的外部不可以通过实例对象访问。原创 2024-01-24 01:57:29 · 499 阅读 · 0 评论 -
c++之说_9_3|自定义类型 struct 前向声明 与 typedef与 using
/定义一个类型别名 前向声明可以定义别名。//定义一个类型别名 前向声明可以定义别名。//本质上就是 A类型的指针 别名并不创造新类型。A get(A b);//虽然不能定义对象 但定义在函数形参中可以。typedef 与 using 只是定义类型别名 而不是创造类型。using 新名 = 旧名;//error 前向声明不可定义对象。typedef 返回值(*类型名称)(参数类型);前向声明不可以访问(会提示你不完整类型)前向声明可以在函数形参中定义对象。原创 2024-01-23 11:32:28 · 371 阅读 · 0 评论 -
c++之说_9_2|自定义类型 struct 无名struct
其实就是这个 struct { int a;答案是 可以的 集合体 集合体 本质上就是各种类型变量的组合。A.a = 100;就和正常的struct 一样使用变量。//error 这两个其实是不同类型。也就是说 在定义时 可以直接就 定义一个变量。无名结构体 且在定义时 定义了个 变量 A。struct 有一个 定义时不给名字的操作。无名结构体之间能转换么?基本数据类型定义的变量 才叫变量。这种集合体 定义的变量。无名结构体的类型是什么?//在main 函数中。//main 函数中。原创 2024-01-23 11:07:31 · 398 阅读 · 0 评论 -
c++之说_9_1|自定义类型 struct 位域操作
2 ^6 = 64 是代表 一位 能表示64个数 0 1 2 3... 63。计算 就是 每一位乘以 自己位对应的十进制数 再相加 结果就是最终的十进制数。2 ^1 = 2 是代表 一位 能表示两个数 0 / 1。// 3 = 11 b (二进制)// 2 = 10 b (二进制)// 2 = 10 b (二进制)sizeof Bit = 1 //一字节大小。sizeof Bit = 2 //刚好二字节。一字节 内的 位不够分配时 会自动开启下一字节。原创 2024-01-23 10:52:05 · 840 阅读 · 0 评论 -
c++之说_9|自定义类型 struct 结构体
/object.b = 100 object.c = 200 这是struct初始化的一种方法。//object.c = 100 object.b= 200 这是struct初始化的一种方法。-› 这是一个箭头 你想通过自定义类型的指针 变量 去访问 该地址的使用此类型解释时的对应成员 就得用它。* 解引用 (我喜欢叫 解地址符 因为本质它就是拿到这个地址所代表的类型对应的变量)//创建 struct a 类型的 A变量(对象)原创 2024-01-23 01:18:52 · 309 阅读 · 0 评论 -
c++之说_8|函数
/如 int n(int a,int b = 0){ return 0;void 无返回值的函数 也是可以使用 return 只是无需在后面带上返回值。//这个函数可以写多个参。//区别就在于 定义 fnvoid1函数时 ()里没写参数。//而定义fnvoid2函数时 ()里 写了个 void。//如此 v 就是函数里 return语句 返回的值。返回到调用处 而函数的返回值 也是它一起拿出去的。(没有默认参数的情况下,有默认值的参数可以不传值)//如此以后 程序的执行流 就会跳转去函数语句块。原创 2023-11-29 11:43:24 · 26 阅读 · 0 评论 -
c++之说_7|循环语句
下一次循环条件判断 成立后 去执行 for( int i = 0;指令后 此时 a = 7 然后回到 while 处 继续判断 条件是否成立 周而复始 直到 while 处 判断的条件不成立 不再允行循环语句块。就是 它会先运行一次 循环语句块后 再去判断while 处的条件 就算第一次 的条件都不成立。不会再执行 这个循环语句了 就当这个循环语句已经完成了 循环条件已经为 false 了。就不会执行 以下的语句 直接跳循环 所以通常我们是在 需要跳循环的执行尾部使用。原创 2023-11-28 23:02:58 · 16 阅读 · 0 评论 -
c++之说_6|判断语句
c++中 有 if 语句 switch 语句 这两个语句 都是拿来判断的。注意 运行只要遇到 break 就会跳出 不会运行以下的语句。if( a < 8 ) 这是整个 if 语句的开始。int b = a;看到没 上述条件是 数值 而不像 if 一样是个判断。这里是上述 case 上的数值 都不匹配时。所以一条语句的概念兴许 与你理解的有点不同。这个会运行这个语句块。这个语句 和 if 的规则 不太一样。当a 7 时运行这个语句块。原创 2023-11-28 11:45:01 · 21 阅读 · 0 评论 -
c++为何要有虚析构函数
虚析构 就是为了防止 delete 释放 堆栈资源时 保证释放的地址值是正确的。看到的 父类类型里的析构函数 而不会调用子类析构函数。这样就导致了 delete 的地址值其实是错误的。这样就导致了 delete 的地址值其实是错误的。会直接调用静态类型的析构函数 就是明眼上去。fp 里面存的值 会与 cp里面存的值不同。fp 里面存的值 会与 cp里面存的值不同。推荐看看上述转载的博客 那个比我说得详细。但是释放时的地址值 却指向了正确地址值。释放时也是错误地址值。转载 2023-11-28 10:48:53 · 34 阅读 · 0 评论 -
C++左值引用|随笔
我们使用 k 改变 k 里面的变量时 pb 里面也会改变 别名而不是新的对象 共享 pb的内存块。左值引用 初始化时 引用了一个对象 而后续 是否可以 更改 去引用另一个对象?k 的引用地址始终没变 但是 内部的 Val 值却是改变了 怎么回事呢。这句话就是 左值引用变量 k 初始化时引用了 pb 这个M类型的对象。而正常的左值引用 正是引用 可以放在等号( = ) 左边的变量的。左值引用 是 初始化引用后 无法再次修改引用其它对象的。引用必须初始化 在函数参数里的除外。原创 2023-11-27 16:32:14 · 148 阅读 · 0 评论 -
c++之说_5|变量作用域
是一片可以由你自由定义的一片内存,你可以指定,该区域的内存不可使用的时候 该区域的内存从你定义使用时 到你自己释放该内存之前 都可以访问使用。所谓失效 就是白虎 认为这些失效的内存 变成未使用的内存 之后指令中新定义的变量 白虎考虑从这些未使用的内存中寻找代表内存的大小。是一种你在指令流中,在{}之间静态修饰定义的变量 该变量所代表的内存 从声明起,到游戏结束之前都可合法使用。从一次游戏开始的时候,到游戏结束都合法存在的区域(全游戏过程中都可以使用 该区域划分代表变量的内存)原创 2023-10-12 21:20:06 · 30 阅读 · 0 评论 -
c++之说_4|代码实践
这个是bool 类型 b变量的值 内存值 01 h 布尔类型 1 字节 非零值都为 true (是的负数也是true) 0值 就为false。给a变量填入的是1 这串内存的值是 00 00 00 01 h (在这上面是显示的都是十六进制)这两个文件是啥,就是我们九宫格游戏上所写的纸条,上面写的都是你用编程语法所创造的代码指令。这是 定义变量的方式之一 这是未初始化的变量 因为没有给变量所代表的内存放入值。上面这是变量的赋值 是的这两种叫法情况不一样 执行结果虽然都是一样的。原创 2023-10-07 23:41:49 · 36 阅读 · 1 评论 -
c++之说_3|数据类型
随着游戏的进行 你发现 一个小格子能表示的东西太少了,而且究竟是表示数字还是文字 是混淆的。白虎并不知晓人类文字 它只知道根据 指令和小格子里摆放的小棒去对照你所写的ASCII 编码。char * 字符指针型 至少是四个字节数(至少四个格子数)具体字节数根据操作系统有关。数据类型 将不同或相同的格子数中的小棒 代表不同的东西 如 文字、数字。就这样白虎根据变量名前面的数据类型 将对应的小棒放入九宫格中的空余的小格子中。因为数字是有正负的 所以你规定了默认情况下 代表数字的类型都是有正负的。原创 2023-10-03 14:06:07 · 28 阅读 · 0 评论 -
c++之说_2|编译器
你指挥她去摆放.....渐渐的她被单调且繁琐的摆放命令烦了 就索性丢盘子了 不玩了。只见她身形一闪 径直跑向了森林深处 之后便传来了野兽的吼叫声 一会...一天,在绿油油的草地上,有两个人类躺在草地上休息,突然其中一个人。话说,在盘古开天劈地之后,苍茫的大地上,万物生机勃勃....她 是编译器 职责负责翻译你所写的指令 为计算机语。提起编程语言,我们就不得不谈谈我们的老朋友,编译器。我的理解她就是来帮我翻译的。她的职责是翻译 翻译你纸条上写的 翻译成虎语。这只通灵的白虎点点头 它变成了无情的摆放虎。原创 2023-10-02 21:39:51 · 62 阅读 · 1 评论 -
c++之说_1|内存篇
游戏内容就是 你指挥她把16根小棒,颜色只有白黑,白的有8根,黑的有8根,放进你指定的九宫格的小格子中。C++指针这些是新手认为很困难的东西,我们就来看看计算机的内存是什么样的,当然我也只是抽象化。而每个内存的标号 就是内存地址 是为了让计算机在庞大的内存池中找到特定位置的内存。计算机的内存就是存放二进制数据的,在计算机中一切数据都是0或1这两个数字表示的。这九宫格里的一个小格子 里面加算机往里面所存放的数据就是 八个 0或1 组成的。内存池就是我们的九宫格 庞大的内存池 就是 庞大的九宫格。原创 2023-10-02 21:02:41 · 37 阅读 · 1 评论 -
c++之说_0|概述
这个是我第一次尝试写我所理解的c++,这也可以说是我所分享的学习c++教程。原创 2023-10-02 19:32:27 · 31 阅读 · 1 评论 -
构造函数与析构函数中的多态问题
答案 无论是间接还是直接在构造或析构中调用虚函数 都没有多态的特性。原创 2023-09-29 17:08:41 · 29 阅读 · 0 评论 -
c++重载隐转
这是一个test的临时对象 直接调用构造函数 本来是不推荐这么用的 因为他的作用域只有这一行 没有test类型对象接受的话。我们通过 operator int*() 定义了 test 对象 强转int*时变成隐式转换 返回了 t 的类成员。上述我们创造了一个 test 类 类里面使用operator运算符 重载了 int *() 什么意思呢。printf("构造函数 *t = %d,c = %c,t=%p\n",*t,c,(void*)t);printf("\n析构函数");原创 2023-09-05 21:21:18 · 34 阅读 · 1 评论 -
c++ const T * const name, T * const name , const T * name的区别
不可以更改指针值,也不可通过该指针修改对应的T对象。不可以更改指针值 , 但可通过该指针修改对应的T对象。可以更改指针值 , 但不可通过该指针修改对应的T对象。我们都知道这个是 T类型的一个名为name的指针。可修改指针值,可通过指针值修改对应的T对象。原创 2023-08-17 23:47:11 · 53 阅读 · 1 评论