C++核心编程之类和对象---C++面向对象的三大特性--封装

目录

类和对象

类和对象的概念

C++面向对象的三大特性

一、封装

封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

二、访问权限

访问权限有三种

struct和class的区别

三、成员属性私有化

成员属性私有化的优点:

四、封装案例

案例1:设计立方体类

案例2:点和圆的关系


类和对象

面向对象编程(OOP)是现代编程的基石之一。C++是一种支持OOP的语言,允许你创建类(Class)和对象(Object)。

类和对象的概念

  1. 类是对对象的抽象。类是一种抽象的数据类型。它们的关系是,对象是类的实例,类是对象的模板。对象是通过new className产生的,用来调用类的方法;类的构造方法 。

  2. 类的意义:

    2-1.类是把属性和方法进行封装,同时对类的属性和方法进行访问控制。

    2-2.类是由我们根据客观事物抽象而成,形成一类事物,然后用类去定义对象,形成这类事物的具体个体。

    2-3.类是一个数据类型,类是抽象的,而对象是一个具体的变量,是占用内存空间的。

  3. 类的访问控制

    在C++中可以对类的属性和方法定义访问级别,public修饰的属性和方法,可以在类的内部访问,也可以在类的外部进行访问。private修饰的属性和方法,只能在类的内部进行访问。

  4. 行为

    所有对象公有操作即成员函数(通常习惯为public属性)属性:所有对象公有特性即数据成员(通常习惯为protected属性)

C++面向对象的三大特性

C++面向对象的三大特性为:封装,继承,多态。

封装目的是实现代码模块化,继承目的是实现代码扩展,静态多态的目的是函数重载和泛型编程,动态多态的目的是虚函数重写。

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

例如:

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

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

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

一、封装

封装是C++面向对象的三大特性之一,封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。

1.封装的意义:

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

2.语法:

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

示例:通过一个圆类中的行为得到圆的周长

cpp 复制代码
#include<iostream>

#include<string>

using namespace std;

// 圆周率

const double PI = 3.14;

// 设计一个圆类   求圆的周长

// class(一个类) 类名

// class代表设计一个类,类后面紧跟着的就是类的名称

class circle {

    // 访问权限

    // 公共权限

public:

    // 属性

    // 半径

    int r;

    //行为:一般为函数

    // 获取周长

    double calculateZC()

    {

        return 2 * PI * r;

    }

};



int main()

{

    // 通过圆类创建具体的圆(对象)

    // 实例化   ( 通过一个类  创建一个对象的过程 )

    circle c1;

    // 给圆对象 的属性进行赋值

    c1.r = 10;
    
    cout << "圆的周长:" << c1.calculateZC() << endl;

    return 0;

}

运行结果:


封装案例1:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

cpp 复制代码
#include<iostream>

#include<string>

using namespace std;

// 设计一个学生类,属性有姓名和学号

// 可以给姓名和学号赋值,可以显示学生的姓名和学号

// 设计学生类

class student {

public:  // 公共权限



    // 类中的属性和行为  我们统一称为  成员

    // 属性  成员属性   成员变量

    // 行为  成员函数   成员方法



    // 属性

    string name;

    int id;



    // 行为

    // 显示姓名与学号

    void showstu()

    {

        cout << "姓名: " << name << "  学号: " << id << endl;

    }



    // 可以通过对象的行为给属性赋值

    void setname(string i_name)

    {

        name = i_name;

    }

    void setID(int i_id)

    {

        id=i_id;

    }

};

int main()

{

    // 创建一个具体的学生

    // 实例化对象

    class student s1;

    // 给s1属性赋值

    s1.setname("张三");

    s1.id = 01;

    s1.showstu();



    class student s2;

    // 给s2属性赋值

    s2.name = "李四";

    s2.id = 02;

    s2.showstu();



    class student s3;

    // 通过对象的行为给属性赋值

    s3.setname("王五");

    s3.setID(03);

    s3.showstu();

    return 0;

}

运行结果:

二、访问权限

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

访问权限有三种

  1. public 公共权限 成员 类内类外都可以访问

  2. protected 保护权限 成员 类内可以访问,类外不可以访问(有继承关系,父子关系)

  3. private 私有权限 成员 类内可以访问,类外不可以访问(父子关系也不可以访问)

示例:

cpp 复制代码
#include<iostream>

using namespace std;

class person{

public:

    // 公共权限

    string name;



protected:

    // 保护权限

    string car;



private:

    // 私有权限

    int password;



public:

    void fun()

    {

        name = "张三";

        car = "BMW";

        password = 123456;

    }

    // 不管哪种形式在类内都是可以访问的

};

int main ()

{

    // 实例化具体的对象

    class person p1;

    p1.name = "李四";



    p1.car = "AMG";  // 保护权限的内容在类外是不能访问的



    p1.password = 258258; // 私有权限的内容在类外是不能访问的

    return 0;

}

报错显示:

struct和class的区别

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

区别:

struct 默认是公共权限

class 默认是私有权限

示例:

cpp 复制代码
#include<iostream>

using namespace std;

class C1
{

    int m_A;// 默认权限   是私有

};

struct C2
{

    int m_A;// 默认权限  是公共

};

int main ()

{

    class C1 c1;

    c1.m_A=1000;

    struct C2 c2;

    c2.m_A=100;

    return 0;

}

报错显示:

三、成员属性私有化

成员属性私有化的优点:

  1. 将所有成员属性设置为私有,可以自己控制读写权限

  2. 对于写权限,可以检测数据的有效性

示例:

cpp 复制代码
#include<iostream>

#include<string>

using namespace std;

// 设计一个人类

class person{

    // 设计一个public 的公共接口

public:

    // 设置姓名

    void set_name(string in_name)

    {

            name = in_name;

    }

    // 获取姓名

    string get_name()

    {

        return name;

    }

    // 设置年龄

    void set_age(int in_age)

    {

        if(in_age<=0||in_age>150){

            cout<<"你输入的年龄有误!"<<endl;

            return;

        }

        age=in_age;

    }

    // 获取年龄

    int get_age()

    {

        return age;

    }

    // 设置情人,只写

    void set_lover(string in_lover)

    {

        lover = in_lover;

}

private:

    // 姓名  可读可写

    string name;



    // 年龄        可读可写

    int age = 0;



    // 情人        只写

    string lover;

};

int main()

{

    class person p1;

    p1.set_name("张三");

    cout<<"姓名为: "<<p1.person::get_name()<<endl;

    p1.set_age(200);

    cout<<"年龄为: "<<p1.person::get_age()<<endl;

    p1.set_lover("鞠婧祎");

    return 0;

}

运行结果:

四、封装案例

案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等。

示例:

cpp 复制代码
#include<iostream>

#include<string>

using namespace std;

/*

1.创建立方体类

2.设计属性

3.设计行为  获取立方体面积和体积

4.分别利用全局函数和成员函数  判断两个立方体是否相等

*/

// 立方体类

class Cube{

public:

    void setL(int L)

    {

        m_L=L;

    }

    int getL()

    {

        return m_L;

    }

    void setW(int W)

    {

        m_W=W;

    }

    int getW()

    {

        return m_W;

    }



    void setH(int H)

    {

        m_H=H;

    }

    int getH()

    {

        return m_H;

    }



    // 获取立方体的面积

    int calculateS()

    {

        return 2*(m_L*m_W+m_W*m_H+m_L*m_H);

    }

    // 获取立方体的体积

    int calculateV()

    {

        return m_L*m_H*m_W;

    }

   

    // 利用成员函数判断两个立方体是否相等

    bool isSameByClass(Cube &C)

    {

        if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){

            return true;

        }

        return false;

    }

private:

    int m_L;// 长

    int m_W;// 宽

    int m_H;// 高

};

// 利用全局函数判断  两个立方体是否相等

bool isSame(Cube &C1,Cube &C2)

{

    if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){

        return true;

    }

    return false;

}

int main()

{

    // 创建一个立方体对象

    class Cube C1;

    C1.setL(10);

    C1.setW(10);

    C1.setH(10);

    cout<<"C1的面积为:"<<C1.calculateS()<<endl;

    cout<<"C1的体积为:"<<C1.calculateV()<<endl;



    // 创建第二个立方体

    class Cube C2;

    C2.setL(10);

    C2.setW(20);

    C2.setH(10);



    // 全局函数判断

    bool ret=isSame(C1,C2);

    if(ret){

        cout<<"C1和C2是相等的"<<endl;

    }

    else{

        cout<<"C1和C2是不相等的"<<endl;

    }



    // 成员函数判断

    ret=C1.isSameByClass(C2);

    if(ret){

        cout<<"成员函数判断:C1和C2是相等的"<<endl;

    }

    else{

        cout<<"成员函数判断:C1和C2是不相等的"<<endl;

    }

    return 0;

}

运行结果:

案例2:点和圆的关系

设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。

示例:

cpp 复制代码
#include<iostream>

#include<string>

#include<cmath>

using namespace std;

// 判断点和圆的关系

/*

点到圆心的距离== 半径  点在圆上

点到圆心的距离 > 半径  点在圆外

点到圆心的距离 < 半径  点在圆内

*/

class Point

{

public:

    void setX(int X)

    {

        m_X=X;

    }

    int getX()

    {

        return m_X;

    }

    void setY(int Y)

    {

        m_Y=Y;

    }

    int getY()

    {

        return m_Y;

    }

private:

    int m_X;

    int m_Y;

};

class Circle

{

public:

    // 设置半径

    void setR(int R)

    {

        m_R=R;

    }

    int getR()

    {

        return m_R;

    }

    // 设置圆心

    void setCenter(Point center)

    {

        m_Center=center;

    }

    Point getCenter()

    {

        return m_Center;

    }

private:

    int m_R;  // 半径

    class Point m_Center;

};

// 判断点和圆的关系

void isInCircle(Circle &c,Point &p)

{

    // 计算两点间距离

    int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()-        p.getY(),2)),0.5);



    if(distance==c.getR()){

        cout<<"点在圆上"<<endl;

    }else if(distance > c.getR()){

        cout<<"点在圆外"<<endl;

    }else{

        cout<<"点在圆内"<<endl;

    }

}

int main()

{

    // 创建一个圆  和一个圆心  的对象

    Circle c;

    c.setR(10);

    Point center;

    center.setX(10);

    center.setY(0);

    c.setCenter(center);



    // 创建一个点

    Point P;

    P.setX(10);

    P.setY(9);



    // 全局函数判断点和圆的位置关系

    isInCircle(c,P);

    return 0;

}

运行结果:

相关推荐
byzh_rc1 分钟前
[模式识别-从入门到入土] 拓展-EM算法
算法·机器学习·概率论
MSTcheng.2 分钟前
【C++STL】map / multimap 保姆级教程:从底层原理到实战应用!
开发语言·c++·stl·map·红黑树
努力学算法的蒟蒻4 分钟前
day41(12.22)——leetcode面试经典150
算法·leetcode·面试
csbysj20204 分钟前
Bootstrap5 按钮组
开发语言
liliangcsdn5 分钟前
Python拒绝采样算法优化与微调模拟
人工智能·算法·机器学习
kaikaile19955 分钟前
使用纯MATLAB M函数实现的无刷直流电机控制系统仿真
开发语言·matlab
Christo36 分钟前
2024《A Rapid Review of Clustering Algorithms》
人工智能·算法·机器学习·数据挖掘
崇山峻岭之间9 分钟前
Matlab学习记录09
开发语言·学习·matlab
AndrewHZ9 分钟前
【图像处理基石】图像梯度:核心算法原理与经典应用场景全解析
图像处理·算法·计算机视觉·cv·算子·边缘提取·图像梯度
让学习成为一种生活方式9 分钟前
组蛋白短链酰化修饰--文献精读187
算法