类和对象——封装

师从黑马程序员

封装

封装的意义一

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

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

设计一个圆类,求圆的周长 代码:

示例1:

cpp 复制代码
#include <iostream>
using namespace std;

class Circle
{
    //访问权限
    //公共权限
public:
    //属性
    //半径
    int m_r;

    //行为
    //获取圆的周长
    double calculateZC()
    {
        const float PI=3.14;
        return 2*PI*m_r;
    }
};



int main()
{
   //通过圆类 创建具体的圆(对象)
   Circle c1;
   //给圆对象的属性进行赋值
   c1.m_r=10;

   cout<<"圆的周长为: "<<c1.calculateZC()<<endl;
    return 0;
}

示例2:

设计一个学生类,属性具有姓名和学号,姓名和学号可以赋值,并将其显示

cpp 复制代码
#include <iostream>
using namespace std;

class Student
{
public:
    // 定义构造函数,初始化姓名和学号
    Student(string name, int stuNum)
        : m_name(name), m_stuNum(stuNum) {}

    // 姓名和学号的setter方法
    void setName(string name) { m_name = name; }
    void setStuNum(int stuNum) { m_stuNum = stuNum; }

    // 打印学生信息的方法
    void printStu()
    {
        cout << "学生姓名为:" << m_name << endl;
        cout << "学生学号为:" << m_stuNum << endl;
    }

private:
    string m_name;
    int m_stuNum;
};

int main()
{
    // 创建一个学生对象,并初始化姓名和学号
    Student s1("张三", 123456);

    // 调用打印学生信息的方法
    s1.printStu();

    return 0;
}

封装意义二:

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

访问权限有三种:

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

2、protected 保护权限 成员 类内可以访问 类外可以访问

3、private 私有权限 成员 类内可以访问 类外可以访问

cpp 复制代码
#include <iostream>
using namespace std;


class Person
{
public:
    //公共权限
    string m_Name;//姓名
protected :
    //保护权限
    string m_Car;//汽车
private :
    //私有权限
    int m_Password;//银行卡密码
public :
    void func()
    {
        m_Name ="张三";
        m_Car ="拖拉机";
        m_Password=123456;
    }
    
};

int main()
{
    Person p1;
    p1.m_Name="李四";
    //p1.m_Car="奔驰";  //保护权限内容,在类外访问不到
    //p1.m_Password=123;// 私有权限内容,类外访问不到
    
    p1.func();
    
    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()
{
   C1 c1;
  // c1=100;  //在class里默认权限  私有,因此类外不可以访问
  

   C2 c2;
   c2=100;//在class里默认权限  公有,因此可以访问

    return 0;
}

成员属性设置为为私有

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

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

cpp 复制代码
#include <iostream>
#include<string >
using namespace std;


class Person
{
public:
    //设置姓名
    void setName(string name)
    {
        m_Name=name;
    }
    //获取姓名
    string getName()
    {
        return m_Name;
    }
    //获取年龄
    int getAge()
    {
        return m_Age;
    }
    //设置年龄(0~150)
    void setAge(int age)
    {
        if(age<0||age>150)
        {
            cout<<"年龄输入有误,赋值失败"<<endl;
            return ;
        }
        m_Age=age;
    }
     //设置偶像
    void setIdol(string Idol)
    {
        m_Idol=Idol;
    }
private:
    string m_Name; //姓名   可读可写

    int m_Age=18;  //年龄  只读  也可以写0~150

    string m_Idol;//偶像 只写
};
int main()
{
    Person p;

    //姓名设置
    p.setName("张三");
    //姓名获取
    cout<<"姓名: "<<p.getName()<<endl;

    //年龄设置
    p.setAge(160);
    //年龄获取
    cout<<"年龄: "<<p.getAge()<<endl;//只读

    //偶像设置
    p.setIdol("小明");//只写
    return 0;
}

联系案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数两个立方图是否相同

cpp 复制代码
#include <iostream>
#include<string>
using namespace std;

class Cube
{
private:
    int m_A;
public:
    // 构造函数初始化边长
    Cube(int A) : m_A(A) {}

    // 设置边长的成员函数
    void setA(int A)
    {
        m_A = A;
    }

    // 获取边长的成员函数
    int getA()
    {
        return m_A;
    }

    // 计算面积的成员函数
    int getArea()
    {
        return m_A * m_A;
    }

    // 计算体积的成员函数
    int getVolume()
    {
        return m_A * m_A * m_A;
    }

    // 成员函数判断当前立方体与另一个立方体是否相同
    bool isSameCube(const Cube& other)
    {
        return m_A == other.m_A;
    }
};

// 全局函数判断两个立方体是否相同
bool areCubesSame(Cube c1, Cube c2)
{
    return c1.getA() == c2.getA();
}

int main()
{
    Cube c1(10);
    Cube c2(5);

    cout << "立方体c1的边长为:" << c1.getA() << endl;
    cout << "立方体c1的面积为:" << c1.getArea() << endl;
    cout << "立方体c1的体积为:" << c1.getVolume() << endl;

    cout << "立方体c2的边长为:" << c2.getA() << endl;
    cout << "立方体c2的面积为:" << c2.getArea() << endl;
    cout << "立方体c2的体积为:" << c2.getVolume() << endl;

    // 使用成员函数判断是否相同
    cout << "成员函数判断:c1和c2是否相同?" << (c1.isSameCube(c2) ? "是" : "否") << endl;

    // 使用全局函数判断是否相同
    cout << "全局函数判断:c1和c2是否相同?" << (areCubesSame(c1, c2) ? "是" : "否") << endl;

    return 0;
}

联系案例2:点和圆的关系

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

cpp 复制代码
#include <iostream>
using namespace std;
//点类
class Point
{
public:
    //设置X
    void setX(int x)
    {
        m_X=x;
    }
    //获取X
    int getX()
    {
        return m_X;
    }
    //设置Y
    void setY(int y)
    {
        m_Y=y;
    }
    //获取X
    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;//半径

    //在类中可以让另一个类 作为本来中的成员
    Point m_Center;//圆心
};
//判断电和圆的关系
void isInCircle(Circle &c,Point &p)
{
    //两点间距离的平方
    int distance=
    (c.getCenter().getX()-p.getX())*(c.getCenter().getX()-p.getX())
   +(c.getCenter().getY()-p.getY())*(c.getCenter().getY()-p.getY());
    //半径的平方
    int rDistance=c.getR()*c.getR();
    //判断关系
    if (distance==rDistance)
    {
        cout<<"点在圆上"<<endl;
    }
    else if(distance>rDistance)
    {
        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(10);

    //判断关系
    isInCircle(c,p);

     return 0;
}

若有侵权,请联系作者

相关推荐
chordful12 分钟前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划
材料苦逼不会梦到计算机白富美23 分钟前
线性DP 区间DP C++
开发语言·c++·动态规划
ahadee40 分钟前
蓝桥杯每日真题 - 第12天
c++·vscode·算法·蓝桥杯
vortex51 小时前
解决 VSCode 中 C/C++ 编码乱码问题的两种方法
c语言·c++·vscode
醉颜凉3 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede3 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1233 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
tumu_C5 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星5 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
Neophyte06085 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法