C++
文章平均质量分 83
语言
森龙安
引擎 || 图形 || 客户端等 个人学习笔记,游戏开发爱好者,个人能力有限,如有不足还望指正
展开
-
进制转换,原码,反码,补码,二进制位运算及应用
0 + 0 = 0, 0 + 1 / 1 + 0 = 1, 1 + 1 = 2->转为2进制 = 10(进一位), 1 + 1 + 1 = 3->转为2进制 = 11(进一位)原码:对于signed的整数,最高位是符号位:正(0)负(1),其余为是数值的绝对值,对于加减运算操作不友好,需要通过反码或补码来完成。反码:正数和原码一致,负数为十进制形式的绝对值按位取反,符号位不变,表示-128(对于8位时)5 + 1 都是正数,正数原反补都一致,对应位相加,因此相加=10100,忽略最高位,为4。原创 2024-09-20 19:04:49 · 1053 阅读 · 0 评论 -
string类,vector<T>,iterator迭代器,C风格字符串,数组
其余api和string没有太大差异,比如==,比较的也是两个vector中对应的元素,但要注意,如果元素类型为自定义类类型,且类中没有包含operator == () ,则无法对元素比较。如果不使用strcmp进行比较,从而比较这两个指针,而非字符串,即比较的是指针的地址,如果两个指针指向的不是同一个C风格字符串,将产生未定义。也是用于存放相同类型对象的容器,但与vector不同的是,它的大小固定,不能向数组添加元素,这样的性质对运行时的性能较好,但是缺乏灵活性;定义数组:type arr[n]原创 2024-09-16 17:17:28 · 1100 阅读 · 0 评论 -
重载new,delete , RTTI,类成员指针
如果想通过成员函数指针使用指向的函数,必须通过成员指针访问符.*或*p,因此成员函数和函数指针不同,它不是一个可调用对象,因此也不能作为算法的谓词,或其他形式。或 classname* class;成员指针并非指向一个对象,而是指向类的成员,对于类的静态成员,我们无需定义指向它们的指针,因为它不属于任何对象,我们可以直接(::)访问。或 classname* class;初始化或赋值,也要指明所属的类的成员,这里&将成员的地址赋给指针,要注意的是,这个过程并不指定成员所属的类对象。原创 2024-09-15 20:52:38 · 988 阅读 · 0 评论 -
多重继承,虚继承
同单继承一样,派生类可以从一个或多个基类继承构造函数(using),并且在派生类生成形参列表一致的构造函数,从而在多继承中,不能从多个基类继承相同的构造函数,如果出现上述情况,需要为构造函数定义派生类版本。虚继承:某个类做出声明,承诺愿意共享它的基类,被共享的基类称为虚基类,这样在继承体系中,无论虚基类出现了多少次,派生类都只包含唯一一个共享的虚基类对象。因为防止被重复初始化,虚基类是由最低层(叶节点)派生类初始化的, 我们可以手动的去调用基类的构造,如果没有手动调用,基类执行默认构造。原创 2024-09-08 19:10:30 · 227 阅读 · 0 评论 -
命名空间,using声明,指令与作用域,重载与namespace
全局命名空间:所有全局作用域的名字都隐式添加到全局命名空间中,全局命名空间是隐式的,没有名字,所以访问形式为::member。命名空间是可以非连续的,比如分离的接口和实现文件,我们定义同名命名空间,甚至在一个文件多次定义,将不会发生任何链接错误。当调用函数时,如果函数传递类类型对象的实参,除了常规作用域(本身,外部)产找名字(此函数)外,还会查找类所在的命名空间。对于模板的特例化版本,必须定义在原始模板所属的命名空间中,当然我们只要在这个命名空间声明特例化,就可以在外部定义,原创 2024-09-07 17:37:47 · 828 阅读 · 0 评论 -
异常处理 || 抛出 || 捕获 || noexcept || 异常类
处理大型程序的3大特性:异常处理:协同处理错误 命名空间:协同开发 多重继承:复杂建模异常处理异常处理机制:允许在运行时对出现的问题相应处理,它将检测和处理分离开,无需知道处理的具体细节 throw表达式,抛出 || 引发 异常 :创建异常对象 try块{ throw表达式}:接受抛出异常的部分 异常对象传递给异常声明 参数,并匹配成功后,执行这个catch块 catch子句块(异常声明 参数){ 函数体 }:捕获异常:捕获try中的throw表达式,函数体:处理异常 catch一个原创 2024-08-25 23:55:23 · 161 阅读 · 0 评论 -
名字查找、拷贝控制操作与继承体系
如果一个类没有合成拷贝控制操作,派生类不会继承基类的函数,而是编译器会为派生类合成默认的版本。除了虚函数的覆盖外,尽量不要定义同名的普通成员和函数。原创 2024-08-25 17:36:00 · 909 阅读 · 0 评论 -
OPP || 继承和抽象类 || 访问控制
OPP面向对象程序设计数据抽象:类的接口声明和定义实现分离 继承:类构成的(树型)层次关系 动态绑定:忽略相似类型区别,用统一的方式使用基类派生类:继承:类名 + 冒号 + 访问说明符 + 基类列表(多重继承) 基类可以有普通的成员(派生类直接继承,不要改变的)和虚函数(想要选择性重新的) 对于继承的层次,一个底层派生类,将继承直接基类的所有成员,而直接基类有会继承它的直接基类的所有成员,因此一个底层派生类会包含它的直接基类以及每个间接基类对象 如果想要防止继承发生,可以在类定义的类名后原创 2024-08-19 01:05:33 · 997 阅读 · 0 评论 -
Operator 运算符 || 可调用对象
运算符重载重载:在同一个作用域内定义多个同名函数,这些函数具有不同的参数列表或函数体。泛型:允许编写代码时不指定具体的数据类型 重载运算符,可以重新定义运算符的行为 几元运算符:包含几个运算对象,重载的函数的行为应与内置版本一致 声明运算符重载函数: 返回类型 + operator + 运算符 +(参数列表(运算对象的数目)); 注意:重载运算符,或者是类的成员,或者至少包含一个类类型参数, 如果作为成员函数,左侧运算对象为隐式this指针,所以显示的参数列表数量应少一个 调用方式:原创 2024-08-19 00:06:37 · 246 阅读 · 0 评论 -
函数 & 类 模板 | 友元 | 别名 | std::function | 模板实参推断 | 显示隐式推断 | 重载模板
typedef。原创 2024-08-12 00:02:56 · 498 阅读 · 0 评论 -
c++ virtual || virtual =0
如何获取到类对象的虚函数表地址:(int*)&a,虚函数表第1个函数地址(int*)*(int*)(&a)虚函数表第2个函数地址(int*)*(int*)(&a) + 1。final:如果不希望某个类被继承,或不希望某个虚函数被重写,则可以在类名和虚函数后加上 final 关键字,再被继承或重写,编译器就会报错。vptr(虚指针):每一个类添加一个指针,指向虚表,因为指针存在,又会占用内存,因为继承的原因,子类中虚表还有内存中的数据都会增加,包含基类的虚函数和数据。包含纯虚函数的类称为抽象类,原创 2024-06-21 23:55:06 · 668 阅读 · 0 评论 -
指针 || 引用 || const || 智能指针 || 动态内存
复合类型:引用:基本概念: 绑定对象,不发生拷贝(当普通赋值时,为确保创建新的对象,分配新的地址,对象拷贝操作),相当于对象的别名 初始化:type & name = obj; 只能绑定在对象(左值)上,之后所有操作都在绑定的对象进行 因为一旦绑定了对象,就不能更改,因此定义时必须初始化 引用非对象:没有 地址 / 内存(数据),因此不能定义引用的引用,也没有const 引用 初始化时对象类型必须要与引用的类型一致: 因为类型不一致时,编译器为确保引用绑定相同类型,创建了原创 2024-07-07 23:19:36 · 524 阅读 · 0 评论 -
拷贝构造赋值 & 折构函数 & 三/五法则 & 指针的拷贝管理 & 移动拷贝赋值
构造函数初始化类的成员拷贝构造当类对象被其他类对象,或可以隐式转换为类类型,初始化时 第一个形参为自身类型引用,其余形参均有默认值,的构造函数为拷贝构造函数 无论我们是否自定义拷贝构造,编译器都会为我们合成默认拷贝构造 会将每个非static成员,逐个拷贝到正在创建的对象中 拷贝方式: 内置类型直接拷贝 类类型成员根据自己的构造函数 数组不能拷贝,但可以逐一拷贝数组成员 拷贝初始化 VS 直接初始化=拷贝初始化,会调用拷贝构造函数 () 直接初始化,会根据重载的函数匹配原创 2024-08-01 23:11:34 · 814 阅读 · 0 评论 -
函数参数返回值 & 类型别名 & 函数重载 & 内联函数 & constexpr & 函数指针
指针形参:相当于指针的拷贝,拷贝的是指针的值,同样不会影响实参指针,只会影响指针所指的对象 | 局部形参指针。按引用传递:形参绑定传入的实参,作为实参的别名,不会发生拷贝。值传递:实参的副本作为形参的初始值,修改形参并不会影响实参。const 指针形参。原创 2024-07-21 23:16:38 · 96 阅读 · 0 评论 -
*this | const成员函数 | 构造函数 | 初始值列表 | friend | 委托构造 | 类类型转换 | 类的static
类声明class a;(仅声明不定义)类定义class a{};访问:类的成员需要:类对象(.)运算符定义:通过::作用域说明符指名函数属于哪个类初始化成员数据:必须使用= 或 {}的形式类对象:类名 + 变量名 等价为-》class / struct 类名 + 变量名。原创 2024-07-29 23:55:48 · 756 阅读 · 0 评论 -
c++ 多重包含/定义 || 链接性 || 生命周期
全局作用域:定义在(类 / 函数 )外部的变量 || 声明/不先声明直接定义在 (类 / 函数 )外部的函数 || 类,整个程序中都可以访问,不同文件中需要,extern type name,访问。类作用域:在类中定义的 成员变量 || 成员函数声明 || 内联函数,可以通过创建类的对象或引用来访问,作用域:类的私有成员只能在类的内部访问,而公有成员可以在类的外部通过对象访问。函数作用域(局部作用域):函数的参数和在函数内部定义的 变量 / 形参,作用域函数,这能在函数内部访问。原创 2024-06-21 23:48:54 · 954 阅读 · 0 评论 -
显示隐式-》初始化 & 类型转换 & 存储区
3.全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。1.栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。值初始化:只提供数量,不提供显示初始值,元素会执行默认初始化,仅限支持默认初始化的类型。元素数量初始化(属于直接初始化):(数量n,初始值)当要多个相同初始值,一般用这种方式。默认初始化:不提供初始值,当定义变量没有初始化,就会执行默认初始化。程序结束后由系统释放。原创 2024-07-21 16:14:12 · 914 阅读 · 0 评论 -
Lambda | RE
Lambda表达式(Lambda Expressions):匿名函数的表示方法,用于在代码中定义临时函数。提供了一种简洁的方式来定义和使用函数对象或回调函数。原创 2024-08-04 12:46:33 · 637 阅读 · 0 评论 -
C++ 左值右值 || std::move() || 浅拷贝,深拷贝 || 数据类型
【代码】左值右值 || std::move() || 浅拷贝,深拷贝 || 数据类型。原创 2024-06-25 19:13:56 · 754 阅读 · 0 评论 -
谓词 & lambda & bind()
对于许多算法,不想使用默认的运算方式,可以使用它的重载版本,新的参数接收谓词,从而会对序列中的元素调用谓词,元素类型必须能转换为谓词参数的类型可调用表达式:可以使用()调用运算符调用,包括函数,函数指针,lambda,bind,重载()的类……(n元)谓词:一个可调用表达式,接受n个参数限制:特定算法仅可接受特定n元的谓词,传入函数()形式的谓词时,可能并不满足参数个数的限制,所以应使用其他形式。原创 2024-07-21 10:56:10 · 291 阅读 · 0 评论 -
I/O | enum
流:字符序列输入流:将数据输入到输入流中输出流:将输出流的缓冲输出。原创 2024-08-04 16:45:58 · 987 阅读 · 0 评论