zoukankan      html  css  js  c++  java
  • C++之封装

    封装

    1 封装的意义

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

    封装的意义:

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

    封装意义一:

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

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

    示例1:设计一个圆类,求圆的周长

    示例代码:

    //圆周率
    const double PI = 3.14;
    
    //1、封装的意义
    //将属性和行为作为一个整体,用来表现生活中的事物
    
    //封装一个圆类,求圆的周长
    //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;
    }
    

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

    示例2代码:

    //学生类
    class Student {
    public:
    	void setName(string name) {
    		m_name = name;
    	}
    	void setID(int id) {
    		m_id = id;
    	}
    
    	void showStudent() {
    		cout << "name:" << m_name << " ID:" << m_id << endl;
    	}
    public:
    	string m_name;
    	int m_id;
    };
    
    int main() {
    
    	Student stu;
    	stu.setName("德玛西亚");
    	stu.setID(250);
    	stu.showStudent();
    
    	system("pause");
    
    	return 0;
    }
    
    

    封装意义二:

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

    访问权限有三种:

    1. public 公共权限
    2. protected 保护权限
    3. private 私有权限

    示例:

    //三种权限
    //公共权限  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;
    }
    

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

    设计立方体类(Cube)

    求出立方体的面积和体积

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

    #include <iostream>
    using namespace std;
    
    //封装案例-立方体
    //设计立方体类(Cube)
    //
    //求出立方体的面积和体积
    //
    //分别用全局函数和成员函数判断两个立方体是否相等。
    class Cube
    {
    	//属性
    private:
    	int m_Length;//长
    	int m_Width;//宽
    	int m_Height;//高
    
    	//方法
    public:
    	//设置和获取长
    	void setLength(int Length)
    	{
    		m_Length = Length;
    	}
    	int getLength()
    	{
    		return m_Length;
    	}
    	//设置和获取宽
    	void setWidth(int Width)
    	{
    		m_Width = Width;
    	}
    	int getWidth()
    	{
    		return m_Width;
    	}
    	//设置和获取高
    	void setHeight(int Height)
    	{
    		m_Height = Height;
    	}
    	int getHeight()
    	{
    		return m_Height;
    	}
    
    	//求立方体面积
    	int Cube_Area()
    	{
    		return (m_Length*m_Width + m_Length*m_Height + m_Width*m_Height) * 2;
    	}
    
    	//求立方体体积
    	int Cube_Volume()
    	{
    		return m_Length*m_Width*m_Height;
    	}
    	
    	//利用成员函数来判断两个立方体是否相等
    	bool isSameByClass(Cube &c)
    	{
    		if (m_Length == c.getLength()&&m_Width == c.getWidth()&&m_Height == c.getHeight())
    		{
    			return true;
    		}
    		return false;
    	}
    };
    
    //利用全局函数来判断两个立方体是否相等
    bool isSame(Cube &c1, Cube &c2)
    {
    	if (c1.getLength() == c2.getLength()&&c1.getWidth() == c2.getWidth()&&c1.getHeight() == c2.getHeight())
    	{
    		return true;
    	}
    	return false;
    }
    
    int main() {
    
    	Cube c1;
    	c1.setLength(10);
    	c1.setWidth(20);
    	c1.setHeight(30);
    
    	cout << "c1的面积为: " << c1.Cube_Area() << endl;
    	cout << "c1的体积为: " << c1.Cube_Volume() << endl;
    
    	Cube c2;
    	c2.setLength(10);
    	c2.setWidth(20);
    	c2.setHeight(30);
    	//使用全局函数来判断
    	bool ref = isSame(c1, c2);
    	if (ref)
    	{
    		cout << "全局函数判断:c1和c2是相等的" << endl;
    	}
    	else
    		cout << "全局函数判断:c1和c2是不相等的" << endl;
    
    	//使用成员函数来判断
    	bool ret = c1.isSameByClass(c2);
    	if (ret)
    	{
    		cout << "成员函数判断:c1和c2是相等的" << endl;
    	}
    	else
    		cout << "成员函数判断:c1和c2是不相等的" << endl;
    
    	system("pause");
    
    	return 0;
    }
    

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

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

    主要学习类的分文件编写方法,先看文件结构目录:

    各文件中的内容:

    circle.h文件

    #pragma once//防止头文件重复包含
    #include <iostream>
    using namespace std;
    #include "point.h"
    
    //圆类
    class Circle
    {
    private:
    	int m_R;//半径
    	Point m_Center;//圆心
    public:
    	void setR(int R);//设置半径
    	
    	int getR();//获取半径
    	
    	void setCenter(Point Center);//设置圆心
    	
    	Point getCenter();//获取圆心
    	
    };
    

    point.h文件

    #pragma once//防止头文件重复包含
    #include <iostream>
    using namespace std;
    
    //点类
    class Point
    {
    private:
    	int m_X;//点的x轴坐标
    	int m_Y;//点的y轴坐标
    public:
    	void setX(int X);//设置X
    	
    	int getX();//返回X
    	
    	void setY(int Y);//设置Y
    	
    	int getY();//返回Y
    	
    };
    
    

    .cpp文件

    #include <iostream>
    using namespace std;
    #include "circle.h"
    #include "point.h"
    
    //点和圆的关系
    ////点类
    //class Point
    //{
    //private:
    //	int m_X;//点的x轴坐标
    //	int m_Y;//点的y轴坐标
    //public:
    //	void setX(int X)//设置X
    //	{
    //		m_X = X;
    //	}
    //	int getX()//返回X
    //	{
    //		return m_X;
    //	}
    //	void setY(int Y)//设置Y
    //	{
    //		m_Y = Y;
    //	}
    //	int getY()//返回Y
    //	{
    //		return m_Y;
    //	}
    //};
    
    ////圆类
    //class Circle
    //{
    //private:
    //	int m_R;//半径
    //	Point m_Center;//圆心
    //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;
    //	}
    //};
    
    //判断点在何处
    void isInCircle(Point &p, Circle &c)
    {
    	//计算两点之间距离的平方
    	int distance =
    		(c.getCenter().getX() - p.getX())*(c.getCenter().getX() - p.getX()) +
    		(c.getCenter().getY() - p.getY())*(c.getCenter().getY() - p.getY());
    
    	//计算半径的平方
    	int R = c.getR()*c.getR();
    
    	if (distance == R)
    	{
    		cout << "点在圆上" << endl;
    	}
    	else if (distance > R)
    	{
    		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(p, c);
    
    	system("pause");
    
    	return 0;
    }
    

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

    point.cpp文件

    #include "point.h"
    
    void Point::setX(int X)//设置X
    {
    	m_X = X;
    }
    int Point::getX()//返回X
    {
    	return m_X;
    }
    void Point::setY(int Y)//设置Y
    {
    	m_Y = Y;
    }
    int Point::getY()//返回Y
    {
    	return m_Y;
    }
    
    
    吾生也有涯,而知也无涯
  • 相关阅读:
    安全测试 + 渗透测试 Xmind 要点梳理
    Confluence wiki——CentOS6.8搭建详解
    Flask从入门到做出一个博客的大型教程(一)
    基于Cat的分布式调用追踪
    Elastic-job使用及原理
    Jmeter模拟不同带宽
    Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)
    SQLyog Enterprise常用快捷键
    MyBatis 与 Spring Data JPA 选择谁?
    Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
  • 原文地址:https://www.cnblogs.com/daimasanjiaomao/p/13762783.html
Copyright © 2011-2022 走看看