【C++】封装

1.封装的意义

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

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

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

属性 成员属性 成员变量

行为 成员函数 成员方法
封装的意义

1.将属性和行为作为一个整体,表现生活中的事物

2.将属性和行为加以权限控制
封装意义一:在设计类的时候,属性和行为写在一起,表现事物

语法

class 类名 { 访问权限: 属性 / 行为 };
示例1:设计一个圆类,求圆的周长

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

//圆周率
const double PI = 3.14;

//设计一个圆类,求圆的周长
//圆求周长的公式:2* PI * 半径
//class 代表设计一个类,类后面紧跟着的就是类名称
class yuan 
{
    //访问权限 公共权限
    public:
    //属性 半径
    int r;

    //行为 获取圆的周长
    double zhouchang()
    {
        return 2 * PI * r;
    }
};
int main()
{
    //通过圆类 创建具体的圆(对象)
    yuan c1;

    //给圆对象的属性进行赋值
    c1.r = 10;

    //2 * PI * r
    cout << "圆的周长为:" << c1.zhouchang() << endl;
    
    system("pause");
    return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的名 和学号

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

class student
{
  public://公共权限
    
     //属性 
      string m_name;//姓名
      int m_id;//学号

      //行为 显示姓名和学号
      void showstudent()
      {
          cout << "姓名:" << m_name << "学号:" <<m_id << endl;
      }

      //给姓名赋值
      void setName(string name)
      {
          m_name = name;
      }
      //给学号赋值
      void setID(int id)
      {
          m_id = id;
      }
};
int main()
{
    //创建一个具体的学生 实例化对象
    student s1;
    //给s1对象 进行属性赋值操作
    s1.setName("祁同伟");
    s1.setID (10001);
    s1.showstudent();//显示学生信息

   
    system("pause");
    return 0;
}

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

访问权限有三种:1.public 公共权限

2.protected 保护权限

3.private 私有权限

cpp 复制代码
#include <iostream>
using namespace std;
#include<string>
//三种权限
//公共权限  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 p;
    p.m_Name = "李四";
    //p.m_Car = "奔驰";//保护权限类外访问不到
    //p.m_Password = 123;//私有权限类外访问不到
   
    system("pause");
    return 0;
}

2. struct和class区别

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

区别:

struct 默认权限为公共

class 默认权限为私有

cpp 复制代码
class C1
{
  int  m_A; //默认是私有权限
};

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

int main() 
{
  C1 c1;
  c1.m_A = 10; //错误,访问权限是私有

  C2 c2;
  c2.m_A = 10; //正确,访问权限是公共

  system("pause");
  return 0;
}

3. 成员属性设置为私有

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

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

cpp 复制代码
#include <iostream>
using namespace std;
#include<string>
//成员属性设置私有
//1、可以自己控制读写权限
//2、对于写可以检测数据有效性
//人类
class Person
{
public:
    //设置姓名
    void setName(string name)
    {
        m_Name = name;
    }
    //获取姓名
    string getName()
    {
        return m_Name;
    }

    //获取年龄 只读 get
    int getAge()
    {
        return m_Age;
    }
    //设置年龄 只写 set
    void setAge(int age)
    {
        if (age < 0 || age>100)
        {
            cout << "年龄输入有误,赋值失败" << endl;
            return;
        }
        m_Age = age;
    }

    //设置偶像 只写 set
    void setIdol(string idol)
    {
        m_Idol = idol;
    }


private:
    string m_Name; //姓名 可读可写

    int m_Age = 18;  //年龄  只读

    string m_Idol;  //偶像  只写
};

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

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

    //偶像设置
    p.setIdol("迪丽热巴"); //只写
    //cout << "偶像:" << p.getIdoi() << endl;//只写状态 外界访问不到
    
   
    system("pause");
    return 0;
}

4.案例

4.1 立方体

设计立方体类、求出立方体的面积和体积

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

cpp 复制代码
#include<iostream>
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 + 2 * m_W * m_H + 2 * m_L * m_H;
	}
	//获取立方体的体积
	int calculateV() {
		return m_L * m_W * m_H;
	}

	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube& c) {
		if (getL() == c.getL() && getW() == c.getW() && getH() == 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(){

		//创建立方体对象
		Cube c1;
		c1.setL(10);
		c1.setW(10);
		c1.setH(10);

		cout << "c1的面积为:" << c1.calculateS() << endl;
		cout << "c1的体积为:" << c1.calculateV() << endl;

		//创建第二个立方体
		Cube c2;
		c2.setL(10);
		c2.setW(10);
		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;
		}

		

	system("pause");
	return 0;
}

4.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;
	}
	//获取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;//半径

	//在类中可以让另一个类 作为本来中的成员
	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);

	system("pause");
	return 0;
}

在实际开发当中不可能把全部类写到一个文件中,所以要分开几个文件写poi
point.h

cpp 复制代码
#pragma once //防止头文件出现重复性
#include <iostream>
using namespace std;

class Point {
public:

    //函数声明
	//设置x
	void setX(int x);
 
	//获取x
	int getX();
 
    //设置y
	void setY(int y);
 
	//获取y
	int getY();
 
private:

    //变量声明
	int m_X;
	int m_Y;
};

point.cpp

cpp 复制代码
#include"point.h"

	//设置x
	void Point:: setX(int x) {  //加Point::使其变成成员函数
		m_X = x;
	}
	//获取x
	int Point:: getX() {
		return m_X;
	}
    //设置y
	void Point:: setY(int y) {
		m_Y = y;
	}
	//获取y
	int Point:: getY() {
		return m_Y;
	}

circle.h

cpp 复制代码
#pragma once
#include<iostream>
using namespace std;
#include"point.h"

class Circle {
public:
	//设置半径
	void setR(int r); 
	
    //获取半径
    int getR();
 
	//设置圆心
	void setCenter(Point center);
 
	//获取圆心
	Point getCenter();

private:
	int m_R;//半径

	//在类中可以让另一个类 作为本来中的成员
	Point m_Center;//圆心
};

circle.cpp

cpp 复制代码
#include"circle.h"


	//设置半径
	void Circle:: setR(int r) {
		m_R = r;
	}
	//获取半径
	int Circle:: getR() {
		return m_R;
	}
	//设置圆心
	void Circle:: setCenter(Point center) {
		m_Center = center;
	}
	//获取圆心
	Point Circle:: getCenter(){
		return m_Center;
	}
相关推荐
烧水烫浪鸟2 分钟前
mysql的高级进阶
开发语言·数据库·mysql
hummhumm16 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
wainyz25 分钟前
Java NIO操作
java·开发语言·nio
喵叔哟34 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk39 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME39 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Zfox_40 分钟前
【Linux】进程信号全攻略(二)
linux·运维·c语言·c++
起名字真南1 小时前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去1 小时前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
cleveryuoyuo1 小时前
AVL树的旋转
c++