类和对象_封装

C++面对对象的三大特征为:封装、继承、多态

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

封装的意义

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

封装意义一:

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

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

//实例1:设计一个圆类,求圆的周长
#include <iostream>
using namespace std;

//圆的周长公式:2 * PI * 半径
const double PI = 3.14;

class Circle {
//访问权限
public:
    int m_r; //属性 半径
    double calculateZC() { //行为
        return 2 * PI * m_r;
    }
};

int main(){
    //通过圆类创造具体的圆(对象)
    Circle c1;
    //给对象的属性进行赋值
    c1.m_r = 10;
    
    cout << "圆的周长为" << c1.calculateZC() << endl;
    return 0;
}

封装意义二:

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

  访问权限有三种:

    1. public  公共权限
    2. protected  保护权限
    3. private      私有权限
#include <iostream>
#include <string>
using namespace std;

//public      成员 类内可以访问  类外可以访问 
//protected   成员 类内可以访问  类外不可以访问  子类可以访问 
//private     成员 类内可以访问  类外不可以访问  子类不可以访问 

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.func();
    //p1.m_Car = "奔驰"; 报错 protected类外无法访问  
    //p1.m_Password = 654321;  报错 private 类外无法访问 
}

struct和class的区别

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

区别:

  • struct默认权限为公共
  • class默认权限为私有
#include <iostream>
#include <string>
using namespace std;

class C1 {
    int m_A;// 默认权限 是私有 
};

struct C2 {
    int m_A;// 默认权限 是公共 
}; 

int main() {
    C1 c1;
    //c1.m_A = 100;  报错 不可访问
    C2 c2;
    c2.m_A = 100; //可以访问 
}

成员属性设置为私有

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

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

#include <iostream>
#include <string>
using namespace std;

class Person {
public:
    //设置姓名
    void setName(string name) {
        m_Name = name;
    }
    //获取姓名 
    string getName() {
        return m_Name;
    }
    //获取年龄 如果想修改(年龄的范围必须是0 - 150之间) 
    int getAge() {
        return m_Age;
    } 
    void setAge(int age) {
        m_Age = 0; //初始化年龄为0 
        if (age < 0 || age > 150) {
            cout << "输入的年龄有误" << endl;
            return;
        }
        else 
            m_Age = age; 
    }
    //设置情人
    void setLover(string lover) {
        m_Lover = lover;
    }
    
private:
    //姓名 可读可写 
    string m_Name; 
    //年龄 可读可写 
    int m_Age;
    //情人 只写 
    string m_Lover;
};

int main() {
    Person p;
    p.setName("张三");
    cout <<  "姓名为:" << p.getName() << endl;
    
    //p.m_Age = 18;  报错 无法直接设置
    p.setAge(151);
    cout <<  "年龄为:" << p.getAge() << endl;
    
    p.setLover("233");//写入情人 
    //cout <<  "情人为:" << p.m_Lover << endl;    报错 无法获取情人 
}

 设计案例:圆和圆上的点

#include <iostream>
using namespace std;

//点类 
class Point {
    public:
        //行为 设置点 获取点 
        void setPoint(int x, int y) {
            m_X = x;
            m_Y = y;
        }
        int getX() {
            return m_X;
        }
        int getY() {
            return m_Y;
        }
        
    //属性 x和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);//设置圆的半径为10 
    Point center;//创建点对的实例象(圆心) 
    center.setPoint(10, 0);//设置点坐标 
    c.setCenter(center);//令该点为圆心 
    
    //创建点的实例对象 
    Point p;
    p.setPoint(10, 11); //设置点坐标 
    
    isInCircle(c, p);//判断点和圆的关系 
}

 

posted @ 2021-08-05 13:20  白藏i  阅读(41)  评论(0)    收藏  举报