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   类名{访问权限:属性/行为}

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

#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:设计一个学生类,可以给姓名和学号赋值,可以显示学生的姓名和学号。

#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            私有权限                成员 类内可以访问,类外不可以访问(父子关系也不可以访问)

示例:

#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 默认是私有权限

 

示例:

#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. 对于写权限,可以检测数据的有效性

示例:

#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)

求出立方体的面积和体积

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

示例:

#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),计算点和圆的关系。

示例:

#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;

}

运行结果:

猜你喜欢

转载自blog.csdn.net/hjl011006/article/details/132915055
今日推荐