C++ Class
2024-12-06 14:26:11 0 举报
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
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的顺序
default argument
delegating constructors
default constructor
default initialization 定义和场景
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
copy constructor, move constructor
copy assignment operator, move assignment constructor
destructor
swap(可选)
rvalue / rvalue reference
需要自定义copy-control的典型场景
Copy, Assign,Destructor
copy constructor定义
合成copy constructor
合成条件
禁止copy的copy consstructor
默认的自动合成copy constructor的行为
copy initialization
示例及定义
发生场景
direct initialization
copy-assignment operator
操作符重载(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之间的关联
destructor => copy constructor & copy assignment operator
copy constructor => copy assignment operator, vice versa
`= default` 和使用范围
preventing copy
阻止copy,copy assignment的具体例子
`= delete` delete funciton
deleted destructor的创建对象的问题
合成的default constructor,copy control, destructor是如何受class member的影响
当class的member是destructor是deleted或不可访问时,会引发class本身的合成的destructor,default constructor, copy-constructor都为deleted
在此条件下,所定义的对象是不能销毁的,也不可以默认构造,也不可通过另一个对象构造
当存在class的member,其copy constructor是deleted或不可访问,则class的合成copy constructor也是deleted
class是不能通过另一个对象创建的
当class'member是禁止assign的,该class也是禁止assign的
当class member包括const class member,reference,则该class也不能自动合成assign行为
当class'member 中存在const member,reference且不存在in-class initializer, 则该class禁止default constructor
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 type & variable's value category
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
相关概念与提纲
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
assign, subscript, function-call
member-access, new / deltete
不应该被重载的操作符
用户定义的operator,应该与built-in类型的operator相一致
assingment和compound assignment 是有关联性的
选择实现为member / non-member operator
必须定义为member的:=, [], (), ->
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) & function object
注意事项
使用方式,声明对象,调用对象
必须是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
pointer to functions
lambda
object create by bind
class overload function-call operator / function objet
callable object,可以是各自type不同,但call signature相同
library 的 `function` type
可以用于支持call signature相同但type不同的场景
`function<T> f`, hold object or nullptr
存在overloaded function的情况,使用function pointer区别
Overloading,Conversion, Operators
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, smartpointer)
e.g. vector<shared_ptr<Base>> bk; bk.push_back(make_shared<Quote>());
一个Basket helper class例子
Multiple & Virtual Inheritance
一个教学例子: Panda => Bear, Endangered
Multiple Inheritance
derivation class list
在多继承的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问题
多继承下的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构建
注意构造顺序: virtual base是最先被构造的; 多个virtual base时,是根据derivation list从左到右的顺序构造的;copy / move / 赋值,顺序也是从左到右;destructor相反
Pointer to Member
Nested Class & Local Class
收藏
收藏
0 条评论
下一页
为你推荐
查看更多