Class member
类相关构成
- Attributes
- Functions
- Constructors
- Copy constructors
- Move constructors
- Destructors
作用域修饰符
- public
- private(default)
- protected
- 可以供继承对象使用
Constructors & Destructors
constructors 可以被复写(overload)
class Player{
private:
int name;
int xp;
public:
Player(); // Constructors
Player(string, int); // Overload Constructors
~Player(); // Destructors
};
constructors initialization list
当我们在constructors中初始化成员变量时候,可以使用initialization list,方便我们对成员变量初始化
class Player{
private:
int name;
int xp;
public:
Player(int xp_val, string name_val)
: name {name_val}, xp {xp_val}{
}
delegating constructors
在初始化列表中,我们可以调用constructors来完成相关的初始化任务。比如overload constructors 时候,我们可以借助delegating constructors, 这样可以帮助很大程度上避免重复代码
class Player{
private:
int name;
int xp;
public:
Player(){}
Player(int name)
:name{name}{}
//Delegating constructors
Player(int name, int xp)
:Player(name), xp{xp}{}
copy constructors
compiler 会自动为类添加copy constructor
请为每个类都添加copy constructor, 并且copy constructor的参数请使用 const reference, 避免reference object被修改
使用raw pointer member(在类中开辟heap上的memory), 会让复制比较混乱,请避免使用
Type::Type(const Type &source){
} //copy constructor的模板
shallow Copy vs deep copy
浅拷贝是指不创建新的对象,只是申明一个新的对象,指向源对象
深拷贝是重新创建新的对象,拷贝的相关的值
如果类成员是raw pointer,请使用深拷贝,浅拷贝将会产生很大问题
move constructor
用来move一个object,而不是copy,因为如果object是深拷贝,将会产生很多性能问题
R-value reference operator(&&)
Type::Type(Type &&source);
Move::Move(Move &&source)
: data{source.data}{
source.data = nullptr
}
//声明move constructor 的方式, 可以使用initialization list,但要记得null out source 中的raw pointer
raw pointer -> 深拷贝 -> move constructor
const object
const object 只能调用object中被指定为const的函数
static class member
类中static member是属于类的,而不属于类实例
Inheritance
Access Specifier in class inheritance
access specifier will specify the access level of attribute of parent class
会将来自父类的属性都限定在同样的访问范围内
继承中的constructor执行顺序
先执行父类的constructor再执行子类的constructor
如果你不指定父类的constructor去执行,父类将执行default constructor(no args constructor)
继承中destructor的执行顺序
先执行子类的destructor再执行父类的destructor,destructor只释放在本类中new的heap空间
子类无法继承父类
- 父类的constructor和destructor(using Type::Type来继承父类的constructor,但也只是初始化父类中的属性,并且无需再将父类的constructor执行一遍,理念便是父类的constructor必须执行,这样is-a的关系才能够成立)
- 父类的overloaded assignment operators(可以继承其他的operators)
- 父类的friend function