C++ Class
2025-01-04 00:40:05 5 举报
AI智能生成
我总结的class相关脑图,包括class fundation, copy-control, operator overloaded & conversion, inheritance & dynamic binding, multiple & virtual inheritance, etc.
作者其他创作
大纲/内容
Class fundation
相关概念
data member / member function
`this` pointer
const member function
class scope
对class的解析步骤分2阶段
friends
在class body外定义member function
定义class相关的接口方法
constructor
constructor定义
合成default constructor
default constructor定义
compiler自动合成default constructor的条件
compiler自动合成的default constructor的行为
合成default constructor不能正常工作的情况
=default的作用
contructor initialize list<br>
access control &encapsulate
private / protected / public
`class` and `struct`
default access level
derivation list中的default access level
friend
friend的设计背景
friend declaration
更多的class特性
定义class type member
inline
`mutable` & `const`
in-class initializer
返回this指针的member function & overload by const
class declaration & incomplete type
friendship revisited
3种friend情况
friend declaration和declaration
overloaded function as friend
class scope
scope operator
namelookup和class的2阶段处理机制
class member declaration中的名字的lookup
name inside member function的lookup
在class scope之后的定义/ 同file范围的lookup
通过:: scope operator访问全局变量
type在scope内不能被redefined
constructor revisited
constructor intializer list
必须需要constructor initializer list的一些需求场景
member initialize的顺序<br>
default argument
delegating constructors
default constructor<br>
default initialization 定义和场景<br>
value initialization 定义和场景
direct initialization 定义和场景
比较value initialization, direct initialization, list initialization
自动type conversion和explicit
implicit conversion的场景
converting constructor
禁止自动type conversion
explicit 定义
explicit的一些注意事项
aggregate class & literal class
Aggregate class定义
aggregate class的缺点
literal type & literal class
non-class literal type
literal class
constexpr constructor
static member
声明与定义
using static member
const / constexpr修饰的static member
static使用incomplete type
Copy Control
相关概念和提纲
初始化 vs 赋值
copy control member<br>
copy constructor, move constructor
copy assignment operator, move assignment constructor
destructor
swap(可选)
rvalue / rvalue reference
需要自定义copy-control的典型场景
Copy, Assign,Destructor <br>
copy constructor定义
合成copy constructor
合成条件
禁止copy的copy consstructor
默认的自动合成copy constructor的行为
copy initialization
示例及定义
发生场景
direct initialization
copy-assignment operator<br>
操作符重载(overloaded operators)
member vs non-member
operator=
合成条件
copy constructor和copy-assignment operator的区别
destructor
定义 & destructor的2个阶段
destructor的作用 & 不针对pointer/reference自动执行delete销毁对象
destructor调用的时机
合成
inheritance和virtual destructor
The Rule of 3/5, 5个copy control之间的关联<br>
destructor => copy constructor & copy assignment operator
copy constructor => copy assignment operator, vice versa
`= default` 和使用范围
preventing copy
阻止copy,copy assignment的具体例子
`= delete` delete funciton
deleted destructor的创建对象的问题<br>
合成的default constructor,copy control, destructor是如何受class member的影响
当class的member是<b>destructor是deleted</b>或不可访问时,会引发class本身的<b>合成的destructor</b>,<b>default constructor</b>, <b>copy-constructor</b>都为deleted
在此条件下,所定义的对象是不能销毁的,也不可以默认构造,也不可通过另一个对象构造
当存在class的member,其copy constructor是deleted或不可访问,则class的合成copy constructor也是deleted
class是不能通过另一个对象创建的
当class'member是禁止assign的,该class也是禁止assign的
当class member包括const class member,reference,则该class也不能自动合成assign行为<br>
当class'member 中存在const member,reference且不存在in-class initializer, 则该class禁止default constructor<br>
private copy control
copy control和资源管理问题
管理资源的策略: valuelike & pointer like
以valuelike策略定义copy control
copy assignment operator的一般规律
以pointerlike策略定义copy control
Reference count思路和实例
思路
存储reference count信息的方案
reference counter的实例
swap
swap的定义和使用场景
swap作用的实例: HasPtr交换指针
使用swap和匹配机制的注意事项
使用swap实现assignment operator
管理dynamic memory的实例: StrVec class实现
vector创建object及push()时,分配内存的策略简介
StrVec类的内存管理策略,是仿照vector的
StrVec的实现代码(带注释)
Moving Objects
引自Bjarne的对lvalue & rvalue概念的说明
rvalue
lvalue
Rvalue reference
定义
lvalue / rvalue reference的各自的能力与限制
返回lvalue / rvalue的表达式
rvalue的临时性
表达式的value category性质
variable‘s <b><u>type </u></b>& variable's <u><b>value category</b></u>
type是rvalue reference的variable,其value category性质是lvalue;
rvalue 扩展: xvalue, prvalue
std::move function
把lvalue转换成rvalue reference
使用move operator,需要此函数的协助
move constructor & move assignment operator
move constructor & move assignment operator 定义
调用move constructor的方法
move assignment operator
move constructor + desctructor
需要防止self-assignment
有关`noexcept`
合成move operation的默认行为和条件
合成的条件
引发move operation合成为deleted的条件
move operation会影响合成的copy operation
lvalue are copied, rvalue are moved
什么情况匹配move constructor / move assign operator,什么情况匹配copy constructor / copy assignment operator
rvalue is copied,if move is deleted
技巧:用pass by value的参数,把copy assignment operatot / move assignment operator 合2为1
move iterator
move iterator返回rvalue reference to element
`make_move_iterator()` 返回move iterator
class的具备rvalue reference参数的member
控制从lvalue/rvalue对象上,调用class member方法
reference qualifier
overloading和reference function
const qualifier和reference qualifier可以区分overloading
扩展阅读
和std::move相反的场景
Overloaded operator & conversions<br>
相关概念与提纲
operator overloading
class type conversion
一些列重载的操作符, 包括IO, arithmetic, relational, assignment, subscript, incre/decre, member access, 以及function-call, conversion operator
Basic
operator loading的定义与注意
允许重载的operator
arithmetic / bitwise
input / output, relational<br>
assign, subscript, function-call<br>
member-access, new / deltete
不应该被重载的操作符
用户定义的operator,应该与built-in类型的operator相一致
assingment和compound assignment 是有关联性的
选择实现为member / non-member operator
必须定义为member的:=, [], (), -><br>
compound-assign, 通常应该被定义为member, 非必须
++ / -- 前缀和后缀应该定义为member
对称的操作符(e.g. Arithmetic, equality, relational, bitwise)应该定义为non-member
Input / Output operators
用户自定义class,为了支持IO,需overload IO operator
<< & >>
定义及形式
需要是non-member
一般需要被声明为所服务的class的friend
istream需要设定状态(成功/失败)
Arithmetic & Relational operators
通常为non-member
equality operators
relational operator
assignment operator
定义,和copy-assignment, move-assignment的区别
必须定义为member function
operator+=, 推荐实现为member
subscript operator
必须是member
应该返回object的reference
increment / decrement operators
推荐实现为member function
postfix / prefix 的实现区别
Member access operator
operator*, operator->
->的限制
Function call operator
operator()(param) & <u>function object</u>
注意事项
使用方式,声明对象,调用对象
必须是member
call-operator可以有多个
常用于library中的algorithm
lambda是function object
编译器把lambda编译成unnamed class object, 包含overloaded call operator
对应的unname object / by value / by reference capture
library中利用funciton object实现算法
C++中存在的几种callable object
function<br>
pointer to functions
lambda
object create by bind
class overload function-call operator / function objet<br>
callable object,可以是各自type不同,但<u>call signature</u>相同
library 的 `function` type
可以用于支持call signature相同但type不同的场景
`function<T> f`, hold object or nullptr
存在overloaded function的情况,使用function pointer区别
Overloading,Conversion, Operators<br>
2类user-defined convesion
converting constructor
conversion operator
注意事项
定义class with conversion operator
conversion to bool
class to bool是经常需要的
implicit class to bool转换容易引发意外
explicit conversion operator
禁止在一般表达式场景自动发生转换; 需要static_cast
在condition场景下,即使是explicit conversion operator,仍然就自动的调用conversion operator
IO Library cin的例子
避免混淆的conversion
mutual conversion
存在到built-in type转换的多个conversion
多个class存在参数相同的converting constructor
best-pratice
`a op b`的匹配过程比函数调用复杂
expression的operator的候选集
一个造成混淆的例子:存在operator type / converting operator
Inheritance & Dynamic binding
相关概念
inheritance
base class / derived class
virtual / override
class derivation list
dynamic binding / run time binding
定义Base class & Derived class
Base / Derived class区分2类方法: virtual / override; 直接继承的方法
有关virtual
定义Derived Class
derived list & access specifier
override,应该在const,reference qualifier之后修饰
derived-to-base conversion
sub-object of Base class / Derived class in derived object
可以把Base Pointer / Reference bind到derived object上
Derived class在构造/析构时的顺序
扩展: 在Derived class的构造/析构的函数中,涉及virtual的调用特点
static member在inherited class之间的使用
对derived class的声明
使用Base时,需要必须有Base的定义
`final`: 禁止继承
Conversion & Inheritance
再次说明derived-to-base conversion
inherited class object之间
smart pointer存储的pointer也可以应用
static type & dynamic type
没有base-to-derived conversion
slice down现象的根本原因
Virtual Function
Virtual function的使用规则
virtual function和default argument
绕过virtual member的机制: `basePointer->BaseClass::member()`
Abstract Base class
Pure Virtual Functions & Abstract class
Access Control & Inheritance
protected member
protected 基本含义
特殊规则: protected member/friend中,操作Base object的protected member的注意点
friedn
3种不同的derivation access list的意义: public, private, protected inheritance
Derived class 中的代码访问Direct Base class: 只受Base class中的access specifier控制
Derived class中的代码访问更远的Base class的member, 即受到base class中的access label的影响,也会受到inheritance chain中每一级derived class的derivation access list specifier的影响
Derived class中的derivation list中的access specifier的作用: 控制使用derived class的用户代码,对Base class member的访问性
使用derived class的用户代码
使用derived class的代码
更远的derived class的子类内的member function代码
derviation list中的access specifier对derived-to-base conversion也存在影响
e.g. D inherit B
用户代码中,接受public derived,其他2者不行
direct derived class member / friend, 直接使用derived-to-base conversion, 不管derivation access specifier
更远的derived class member / friend代码,仅当D是B的public,protected可行
类的3类用户角色
Firendship & Inheritance
firend是不能传递,也不能继承
Base class的friend不能f访问Derived class member;
Derived class的firend,不能访问Base class member; 但注意,derived class member可以通过用户代码访问derived object中的base部分中的protected的部分;
using指令
using指令用于选择Base类的member在derive中继承
e.g. using Base::size;
class / struct 中default inheritance / access level
在inheritance下的Class Scope
class is a scope
继承的classes,是嵌套的scope,inner是derived class, outer是base
argument-dependent name lookup
nested scope的名字覆盖
p->mem, obj.mem() 的名称查找机制
name lookup & type checking & generate calling code
overriding overloaded function
Derived class中的functoin如覆盖Base中的overloaed member时,或者不覆盖,或者全部覆盖overloaded set
using指令可以全部引入overloaedfunction membe; 用户只需重新定义部分overloaed set即可
inheritance下的contructor和copy control
Virtual Destructor
Virtual Destructor才可以让delete时,正常释放资源
由于存在destructor, 即使是使用=default, compiler不会自动合成move operation
synthesized copy control
在存在继承的情况下,合成的copy control operation / destructor,也会自动的调用父类进行构建/析构
Base class中定义的情况,可能会导致dervied class中的mmeber被合成为deleted
base class的default constructor, copy / move operation, destructor为deleted时, derivedclass中的相应的member也是delete
使用 = default 来请求move operation的默认行为时,如base class的相应move operation是deleted,则derived class中的合成的move operation也是deleted;
virtual destructor,禁止了derived class类的move operation合成,如果需要,则需要自己定义move/copy operation
Derived class copy control members
derived class的copy, move constructor, 需要调用direct base class constructor去初始化,应该在initializerlist中完成
assignment operator,也必须对它的base part的member copy/move
Derived Class destructor
destructor只需要负责处理它自己分配的资源;
销毁object的顺序是和constructor相反的;derived -> base
在constructor和destructor中,调用virtual function的特殊性
object is incomplete现象
调用virtual方法,会调用和当前执行的constructor/destructor 类型一致的object的版本
Inherited constructors
using指令,接纳base类中的constructor
不可以继承default, copy, move ,converting constructor
using指令复用constructor,并不能改变access level,和base一致
保持了原有的explicit,constexpr性质
using指令继承的constructor,会衍生出多个default argument的版本
container和inheritance
在container中存储具备继承关系的object,一般采用存储pointer的间接访问object的方式(pointer, reference, <b>smartpointer</b>)
e.g. vector<shared_ptr<Base>> bk; bk.push_back(make_shared<Quote>());
一个Basket helper class例子
Multiple & Virtual Inheritance
一个教学例子: Panda => Bear, Endangered<br>
Multiple Inheritance
derivation class list<br>
在多继承的class的object中,包含着每个base subobject
多继承中的base class的构建顺序,依赖于derivation list中出现的顺序; 和它们在initializer list中的顺序无关; destructor的执行顺序,是与constructor相反的(因此,也是和derivation list的顺序相关的)
derived-to-base conversion
在多继承中可行,可以cast到任意的base上;
由于base class被认为equally good, overloaded function 容易出现ambiguous问题<br>
多继承下的class scope & name lookup
name lookup发生在多个继承链上,名字可能出现冲突
当出现冲突,ambiguous,用scope operator指定版本
Virtual Inheritance
问题背景: 解决多个相同的base class问题
定义: 允许在后续的子类中共享它的base class, virtual base
virtual inheritance的结构
是在使用most derived class使用virtual base的需求出现之前,就定义在inheritance hierarchy之内的
定义格式
constructor & virtual inheritance
virtual base class的初始化,应该是 由most derived class的constructor构建
<span style="font-size: inherit;">注意构造顺序: virtual base是最先被构造的; 多个virtual base时,是根据derivation list从左到右的顺序构造的;copy / move / 赋值,顺序也是从左到右;destructor相反</span><br>
Pointer to Member
Nested Class & Local Class
收藏
收藏
0 条评论
下一页