(持续更新)c++中的继承、封装、多态

みちこのBLOG / 2024-03-06 / 原文

c++面向对象的三大特性为:继承、封装和多态

c++认为万事万物都皆为对象,对象上有其属性和行为

例如:

  人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌⋯

  车也可以作为对象,属性有轮胎、方向盘、车灯…行为有载人、放音乐、放空调…

  具有相同性质的对象,我们可以抽象称为类,人属于人类,车厲于车类

 

1.封装

1.1封装的意义

封装是c++面向对象的三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物

语法:class 类名{ 访问权限:属性 / 行为 };

实例代码:

#include <iostream>

using namespace std;

const double PI = 3.14;

class Circle {
public:
    int m_r;

    double calculate_ZC() {
        return 2 * PI * m_r;
    }
};

int main() {
    //实例化:通过一个类,创建一个对象的过程
    Circle c1;
    c1.m_r = 10;
    cout << "圆的周长为:" << c1.calculate_ZC() << endl;
    return 0;
}

 

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

(1)public 公共权限

(2)protected 保护权限

(3)private 私有权限

实例代码:

#include <iostream>
#include <string>

using namespace std;

class Student {
    //属性
public:
    string m_name;
    int m_age;
    //行为
public:
    void setName(string name) {
        m_name = name;
    }

    void setAge(int age) {
        m_age = age;
    }

    void showStu() {
        cout << "学生姓名:" << m_name << endl << "学生年龄:" << m_age << endl;
    }
};

int main() {
    Student s1;
    s1.setName("张三");
    s1.setAge(18);
    s1.showStu();
}

 

1.2struct和class的区别

c++中struct和class唯一的区别就在于默认的访问权限不同

区别:

  • struct默认权限为公共
  • class默认权限为私有

 

1.3成员属性设置为私有

优点一:将所有成员属性设置为私有,可以自己控制读写权限

优点二:对于写权限,我们可以检测数据的有效性

实例代码:

#include<iostream>
#include<string>

using namespace std;

class Person {
private:
    string m_name; //姓名 可读可写
    int m_age = 18; //年龄 只读
    string m_addr; //地址 只写

public:
    void setName(string name) {
        m_name = name;
    }

    string getName() {
        return m_name;
    }

    int getAge() {
        return m_age;
    }

    void setAddr(string addr) {
        m_addr = addr;
    }

private:
    void showStu() {
        cout << "姓名:" << m_name << "年龄:" << m_age << endl;
    }
};

int main() {
    Person p1;
    p1.setName("张三");
    cout << "姓名:" << p1.getName() << endl;
    cout << "年龄:" << p1.getAge() << endl;
}