C++核心:类和对象之封装(意义、和struct区别、成员属性设为私有、两个封装案例)

1. 封装的意义

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

  • 意义·:

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

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

      //圆周率
      const double PI = 3.14;
      //class代表设计一个类,后面跟着的是类名
      class Circle
      {
      public:  //访问权限  公共的权限
      
      	//属性
      	int m_r;//半径
      
      	//行为
      	//获取到圆的周长
      	double calculateZC()
      	{
      		//2 * pi  * r
      		//获取圆的周长
      		return  2 * PI * m_r;
      	}
      };
      
      int main() {
      
      	//通过圆类,创建圆的对象
      	// c1就是一个具体的圆
      	Circle c1;
      	c1.m_r = 10; //给圆对象的半径 进行赋值操作
      
      	//2 * pi * 10 = = 62.8
      	cout << "圆的周长为: " << c1.calculateZC() << endl;
      
      	system("pause");
      
      	return 0;
      }
      
    • 类在设计时,可以把属性和行为放在不同的权限下,加以控制

    • 访问权限有三种:

    //三种权限
    //公共权限  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默认权限为私用
    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. 对于写权限,我们可以检测数据的有效性
class Person {
public:

	//姓名设置可读可写
	void setName(string name) {
		m_Name = name;
	}
	string getName()
	{
		return m_Name;
	}


	//获取年龄 
	int getAge() {
		return m_Age;
	}
	//设置年龄
	void setAge(int age) {
		if (age < 0 || age > 150) {
			cout << "你个老妖精!" << endl;
			return;
		}
		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.setAge(50);
	cout << "年龄: " << p.getAge() << endl;

	//情人设置
	p.setLover("苍井");
	//cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取

	system("pause");

	return 0;
}

4.练习案例1:设计立方体类

  • 设计立方体类(Cube)
  • 求出立方体的面积和体积
  • 分别用全局函数和成员函数判断两个立方体是否相等。
#include<iostream>
using namespace std;

//立方体类设计
//1.创建立方体类
//2.设计属性
//3.设计行为 后去立方体面积和体积
//4.分别利用全局函数和成员函数 判断连个立方体是否相等

class Cude
{
	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_L * m_H + 2 * m_W * m_H;
		}
		
		//获取立方体体积 
		int calculateV()
		{
			return m_L * m_W * m_H;
		}
		
		//利用成员函数判断两个立方体是否相等
		bool isSameByClass(Cude &c)
		{
			if (m_H == c.getH() && m_L == c.getL() && m_W == c.getW()) 
			{
			return true;
			}
	
			return false;
		}
	
	private:
		
		int m_L;//长 
		int m_W;//宽 
		int m_H;//高 
		
};

//利用全局函数判断 两个立方体是否相等
bool isSame(Cude &c1, Cude &c2)//为了方便或者传入的数据更简单,用引用传递 
{
	if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW()) 
	{
		return true;
	}
	
	return false;
 } 

int main()
{
	//创建立方体对象
	Cude c1;
	c1.setH(10);
	c1.setL(10);
	c1.setW(10);
	
	cout << "c1的面积为:" << c1.calculateS() << endl;
	cout << "c1的体积为:" << c1.calculateV() << endl;
	
	//创建第二个立方体
	Cude c2;
	c2.setH(10);
	c2.setL(10);
	c2.setW(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;
}

2. 练习案例2:点和圆的关系

  • 设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
//"main.cpp"
#include<iostream>
using namespace std;
#include"point.h"
#include"circle.h"

点类
//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;
}

//"point.h"
#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"
#include"point.h"

void Point::setX(int x)
{
	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"
#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"
#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; 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦生dwu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值