Skip to content

类和对象

类和对象

面向对象的三大特性:封装、继承、多态。

封装

  1. 将属性和行为做一个整体
  2. 权限控制
class Circle
{

public:
    Circle(){
        cout<<"构造函数"<<endl;
    }
    int r;
    double l()
    {
        return 2*PI*r    
    }
};

int main(){
    Circle c;
    c.r = 10;
    cout<<c.l()<<endl;
}

访问权限一共有三种:

  1. 公共权限:类内、类外也可以访问
  2. 保护权限:类内可以访问,类外不能访问,可集成
  3. 私有权限:类内可以访问,类外不能访问,不可继承

class 与 struct 本质上是一个东西,都可以做容器,其本质区别在于:

struct 默认访问权限为public,class 默认为私有。

成员属性设置为私有的使用场景:

  1. 控制读写权限
  2. 再修改前,可以进行检查:比如A.change(...)来修改某个私有成员,在该函数中进行检查。

对象化的初始化和清理

  1. 初始化一个对象的状态(初始化);
  2. 使用完一个对象,也要及时清理(析构)。

初始化函数与析构函数会被编译器是自动调用。

构造函数类名(){}

  1. 构造函数没有返回值
  2. 与类同名
  3. 构造函数可以有参数,因此可以发生重载

析构函数~类名(){}

构造函数

  1. 无参构造
  2. 有参构造
  3. 拷贝构造
类名 (){};
类名 (参数){};
类名 (const 类名 &p){};

如何实例化对象时候指定各种构造函数呢?

Person p1;
Person p2(1,2);
person p3(p2);

Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);

继承

继承是面向对象的三大特性之一,通过继承减少重复代码。

class Web
{
public:
    function1(){};
    function2(){};
};

class ChildWeb : public Web
{
public:
    child_function(){};
}

继承方式:

  1. 公共继承
  2. 保护继承
  3. 私有继承

image-20220517173915515

可以看出,公共继承就是直接照搬;保护继承就是把父类中的公共放在保护中;最后私有就是全部放到私有成员中。

不可访问不代表不放入内存中!

继承中的构造和析构顺序:父构造,子构造,子析构,父析构。

继承中同名成员:调用子类的成员child.func(), 调用父类的成员child.base::func()

多态

静态多态:函数重载,运算符重载。编译阶段确定函数地址;

动态多态:派生类和虚函数实现运行时多态。运行阶段确定函数地址。

动态多态的条件:

  1. 继承
  2. 子类重写父类的虚函数virtual void function