结构体区别

structclass仅仅只有默认的访问控制不同

struct默认是public,class默认是private

如果数据只是简单的聚合就用struct,如果用于表示行为和状态的复杂对象,不能随意让外部访问,则用class(这种访问控制的能力就是封装性,类的重要特性)

通过类定义的变量称之为对象

类的操作

访问控制:private, protected, public, friend

用于初始化的函数称为构造函数

析构函数用于对象销毁时做清理,调用时机是对象被销毁时,不管是栈中的对象被自动销毁,还是new出来的对象被手动delete,都会自动调用析构函数

成员函数 在对象内写的函数(只有public才能被外部调用,如果是private只能在成员函数内被调用)

成员函数的this指针指向对象自身,默认会传递

运算符重载(操作符重载)可以让内置的运算符进行重解释,可以将函数名改成对应的操作符,需要加上operator关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class BigInt {
int* digits = nullptr;
int size = 0;
public:
BigInt(const string &str, int_sign){
//构造函数
size = str.size();
digits = new int[size];
}
~BigInt(){
//析构函数
}
BigInt operator+(const BigInt &x) {}
BigInt& self_add(const BigInt &x){
return *this;
}
};

一般运算符都是由左右两部分组成的 lhs operator rhs

重载运算符的操作就是右边的操作数auto operator-(const Type &rhs){}

explicit关键字代表必须显式转化,类型转化运算符使用,避免因为二义性带来问题

friend友元,在类中声明并加上友元声明,就可以在其他位置进行访问该类的私有成员,也可以单独对类的某个成员函数声明为友元friend double BigFloat::pow(BigInt&);

成员函数的其他命名方法:BigInt BigInt::add(BigInt &X) {}

继承与多态

继承:继承另一个类的成员变量和函数

1
2
3
4
5
6
7
8
9
class Obj {
int x, y, w, h;
int hp, attack;
public:
bool test(Obj* other);
};
class Plant : Obj {
// Plant为子类(派生类) Obj为父类(基类)
}

子类可以访问public和protected成员,不能访问private成员

关键字 ==final== 如果一个类被final修饰,则这个类不能被继承

构造函数和析构函数无法被继承

虚函数 —> 动态多态

1
2
3
4
5
6
7
8
class Zombie {
public:
virtual void attack () {};
};
class Gargantuar : public Zombie {
public:
void attack () override {}; //override代表这个函数是对虚函数的重写
};