C++ 专栏
文章平均质量分 51
Currybeefer
理想是条不归路,不下战场才能赢
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《游戏编程模式》学习笔记(十三)组件模式 Component
单一实体跨越了多个领域。为了保持领域之间相互分离,将每部分代码放入各自的组件类中。实体被简化为组件的容器。组件模式没什么好说的,就是放弃传统的继承思路,用组合代替继承来达到对各个领域的解耦。不是让两个类继承同一类来分享代码,而是让它们拥有同一个类的实例。举例public:Bjorn(){}private:int x_, y_;在Bjorn的update方法中,我们作如下更新// 根据用户输入修改英雄的速度break;break;// 根据速度修改位置。原创 2023-10-09 19:09:11 · 430 阅读 · 0 评论 -
C++ string的简易底层实现
string底层实现,参考了网上的一些代码,注释都写在代码里了,比较清楚。原创 2022-11-29 12:02:32 · 544 阅读 · 0 评论 -
为什么函数模板声明和定义必须写在一起?
在解释这个问题之前,我们要先回顾一下一个C++程序编译链接的过程。 1.编译链接的过程我们编程的时候习惯将函数的声明文件写在.h文件中,然后将函数的定义写在.cpp文件中,在需要调用别的文件中的某个函数的时候就会将该函数所在的头文件include到调用处的文件头部。在C++程序预编译过程中,所有头文件都会展开,在之后的过程中所有的头文件都会消失,只剩下头部被展开了#include的源文件被转为.obj文件。因为展开了头文件的缘故,这些.cpp文件中会有许多的函数声明。而这些函数声明的真正定义往往就集中在某一原创 2022-07-10 14:06:24 · 2119 阅读 · 1 评论 -
C语言字符串的长度与大小
在C语言中没有string类型的数据,要想表示字符串一般有两种形式:1.字符数组字符数组表示字符串可以有两种方式: 此种方法声明的字符串本质上是字符数组,在赋值前数组大小还没有确定。在赋值后编译器会自动在“aaaaa”后加上’\0‘以表示字符串的结尾,此时str1中存储的数是“aaaaa\0”,数组的大小为6。 此种方法声明的字符串本质上是字符数组,在声明部分已经定义了数组的大小为5,在赋值“bbbb”后str2已没有空间来存储‘\0‘,str2存储的数据是“bbbbb”,数组的大小为5; 此种方法声明的字转载 2022-06-11 13:44:20 · 4232 阅读 · 1 评论 -
预编译,编译,汇编,链接,静态库,动态库都是什么
预编译: 预编译又称为预处理,是做一些代码文本的替换工作 将头文件展开,取消注释,替换所有宏定义的符号编译: 将文件进行词法分析,语法分析,语义分析,符号汇总后,将代码翻译为汇编语言(汇编语言就是MOV,ADD之类的东西)汇编: 将文件转换为二进制文件即目标文件,每一个源文件对应一个目标文件,在windows中目标文件的后缀为.obj链接: 其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器。在完成汇编后,各个目标文件还没有原创 2022-06-02 13:07:27 · 732 阅读 · 0 评论 -
C++菱形继承问题和虚继承分析
转载自:https://mp.weixin.qq.com/s/eBYegV9HC8mFaXX7w-XZNg 侵删 二义性 在面向对象中,常常存在这样的事情,一个派生类它有两个或两个以上的基类,这种行为称作多重继承,示意图如下: 如果在多重继承中Class A 和Class B存在同名数据成员,则对Class C而言这个同名的数据成员容易产生二义性问题。这里的二义性是指无法直接通过变量名进行读取,需要通过域(::)成员运算符进行区分。例如: //基类A class A { public: A()转载 2022-04-14 01:02:20 · 283 阅读 · 0 评论 -
C++实现一个包含括号匹配的计算器
这只是先记录一下,后续会完善计算题功能以及添加注释 int Caculator(string s) { stack<int> stk; int num = 0; int sign = '+'; for (int i = 0; i < s.size(); i++) { char c = s[i]; if (isdigit(c)) { num = num * 10 + (c - '0原创 2022-02-08 12:18:59 · 1804 阅读 · 0 评论 -
C++中explicit关键字的使用
在C++中,我们有时可以将构造函数用作自动类型转换函数。但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++新增了关键字explicit,用于关闭这种自动特性。即被explicit关键字修饰的类构造函数,不能进行自动地隐式类型转换,只能显式地进行类型转换。 注意:只有一个参数的构造函数,或者构造函数有n个参数,但有n-1个参数提供了默认值,这样的情况才能进行类型转换。 下面通过一段代码演示具体应用(无explicit情形): /* 示例代码1 */ 2 class Demo 3 {转载 2021-01-30 10:16:01 · 326 阅读 · 0 评论 -
C++ 对象的 this指针是否占用内存?
不占用内存,this相当于非静态成员函数的一个隐函的参数,不占对象的空间。它跟对象之间没有包含关系,只是当前调用函数的对象被它指向而已。 所有成员函数的参数,不管是不是隐含的,都不会占用对象的空间,只会占用参数传递时的栈空间,或者直接占用一个寄存器。 看如下代码: stuct A { char c; }; int main() { cout << sizeof(A) << endl; // 1 } 结构体 A 的大小 == sizeof(char),这个类里根本转载 2021-11-09 02:15:55 · 787 阅读 · 0 评论 -
C++类大小详尽讲解
尊重原创,转载自:这里 C++类的大小,是一个比较经典的问题,学过C++后,应该对类大小有清晰的认识,长话短说,本文精简凝练,我们进入正题!!! 1.类的大小与什么有关系? 与类大小有关的因素:普通成员变量,虚函数,继承(单一继承,多重继承,重复继承,虚拟继承) 与类大小无关的因素:静态成员变量,静态成员函数及普通成员函数 2.空类 空类即什么都没有的类,按上面的说法,照理说大小应该是0,但是,空类的大小为1,因为空类可以实例化,实例化必然在内存中占有一个位置,因此,编译器为其优化为一个字节大小。 某类继承转载 2021-11-09 02:13:22 · 277 阅读 · 0 评论 -
C++结构体字节对齐
思考:这是struct结构的内存对齐问题,结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。其主要有: 1)结构体内部成员对齐 对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调 整位置,空缺的字节编译器会自动填充也.转载 2021-10-25 01:56:13 · 888 阅读 · 0 评论 -
深拷贝和浅拷贝的区别详解
深拷贝和浅拷贝的作用是复制对象数据,这两者都用于构造拷贝构造函数中,那么这俩之间到底有什么区别呢? 先上答案 - 浅拷贝:简单的赋值拷贝操作 - 深拷贝:在堆区重新申请内存空间,进行拷贝操作 下面举一个例子,让大家看看深拷贝和浅拷贝的不同之处 Class Student { public: int age; Student(int i_age) { age=i_age; cout<<"执行构造函数"<<endl; } ~Student() { cout<原创 2021-10-06 11:01:28 · 1423 阅读 · 0 评论 -
【C++】Placement New
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。 它的原型如下: void *operator new( size_t, void *p ) throw() { return p; } 首先我们区分下几个容易混淆的关键词:new、operator new、placement new new和delete操作符我们应该都用过,它们是对堆中的内存进行申请和转载 2021-09-28 11:40:53 · 1006 阅读 · 0 评论 -
为什么基类的析构函数需要是虚函数?
只有在通过基类指针(或引用)间接指向派生类子类型时多态性才会起作用。派生类的指针只调用自己的函数!基类指针的函数调用如果有virtual则根据多态性调用派生类的函数,如果没有virtual则是正常调用基类的函数。原创 2021-02-01 20:13:06 · 628 阅读 · 0 评论 -
C++虚函数的调用过程
C++编译阶段,没办法知道一个基类的指针或引用所指对象的类型,所以没办法通过这个指针判断调用的虚函数到底是谁的,所以只能通过查找虚函数表来找到函数的入口地址。 一个类,如果有虚函数,那么编译器在编译这个类的时候就会为它添加一个虚函数表,以及指向这个虚函数表的指针。继承这个基类的之类,也会新建一个虚函数表,如果没有重载,那么这个新的虚函数表中的函数指针就被拷贝为父类该函数的地址,否则为新的函数地址。编译器会将这些函数指针在虚函数表中按照基类中该函数出现的次序排列,子类中的虚函数表也将以这种方式排列。 每个有虚转载 2021-02-01 08:45:47 · 1537 阅读 · 0 评论
分享