c++类与对象——封装

1. 封装的意义

类和对象
C++面对对象三大特性:封装、继承、多态

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

例如:
人可以作为对象,属性有姓名、年龄、身高...行为有走、跑、吃饭、唱歌
车也可以作为对象、属性有轮胎、方向盘...行为有载入、放音乐
具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类*/

封装:
封装的意义:1.将属性和行为作为一个整体,表现生活中的事物
           2.将属性和行为加以权限控制
封装意义一:
      在设计类的时候,属性和行为写在一起,表现事情
语法:class 类名{ 访问权限: 属性 / 行为 };*/
#include <iostream>
using namespace std;

/*类和对象
  C++面对对象三大特性:封装、继承、多态
  
  C++认为万事万物都皆为对象,对象上有其属性和行为
  
例如:
    人可以作为对象,属性有姓名、年龄、身高...行为有走、跑、吃饭、唱歌
	车也可以作为对象、属性有轮胎、方向盘...行为有载入、放音乐
	具有相同性质的对象,我们可以抽象为类,人属于人类,车属于车类*/

/*封装:
  封装的意义:1.将属性和行为作为一个整体,表现生活中的事物
              2.将属性和行为加以权限控制
封装意义一:
          在设计类的时候,属性和行为写在一起,表现事情
语法:class 类名{ 访问权限: 属性 / 行为 };*/

//示例1.设计一个圆类,求园的周长
//园求周长的公式:2 * PI * 半径
const double PI = 3.14;

//class 代表设计一个类,类后面紧跟的就是类名称
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;
	system("pause");
	return 0;
}

2.实例—学生类

#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.m_Id = 1;
	//s1.m_Name = "张三";
	s1.setname("张三");
	s1.setid(1);
	//显示学生信息
	s1.showstudent();

	student s2;
	s2.m_Id = 2;
	s2.m_Name = "李四";
	s2.showstudent();

	system("pause");
	return 0;
}

3. 封装的意义2

封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种: 
1.public     公共权限  成员类内可以访问,类外可以访问
2.protected  保护权限  成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护内容
3.private    私有权限  成员类内可以访问,类外不可以访问,儿子不可以访问父亲的私有内容
#include <iostream>
using namespace std;

/*封装意义二:
  类在设计时,可以把属性和行为放在不同的权限下,加以控制
  访问权限有三种: 
  1.public     公共权限  成员类内可以访问,类外可以访问
  2.protected  保护权限  成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护内容
  3.private    私有权限  成员类内可以访问,类外不可以访问,儿子不可以访问父亲的私有内容*/

class Person 
{
    
    
public:
	//公共权限
	string m_Name;

protected:
	//保护权限
	string m_Cat;

private:
	//私有权限
	int m_Password;

//private:
public:
	void func() /*类内内容*/
	{
    
    
		m_Name = "张三";
		m_Cat = "拖拉机";
		m_Password = 123456;
	}
};
int main()
{
    
    
	//实例化具体对象
	Person p1;
	p1.m_Name = "李四";
	//p1.m_Car = "奔驰"; // 保护权限内容,类外访问不到
	//p1.m_Password = 123; //私有权限内容,类外也是访问不到
	//p1.func();
	p1.func();
	system("pause");
	return 0;
}

4. strunct和class的区别

在c++中struct和class唯一的区别在于默认的访问权限不同
区别:
struct 默认权限为公共
class  默认权限为私有
#include <iostream>
using namespace std;
/*在c++中struct和class唯一的区别在于默认的访问权限不同
区别:
    struct 默认权限为公共
	class  默认权限为私有*/

class c1
{
    
    
	//上面什么权限都不写

	int m_A;//默认权限为私有
};

struct c2
{
    
    
	int m_A;//默认权限为公共
};

int main()
{
    
    
	c1 c1;
	//c1.m_A = 100; //在class里默认权限为私有,因此不可以访问
	
	c2 c2;
	c2.m_A = 100; //在struct默认权限为公共,因此可以访问

	system("pause");
	return 0;
}

5.成员属性设置为私有

成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
#include <iostream>
using namespace std;
#include <string>
/*成员属性设置为私有
  优点1:将所有成员属性设置为私有,可以自己控制读写权限
  优点2:对于写权限,我们可以检测数据的有效性*/

//设计人类
class Person
{
    
    
public:
	//写(设置)姓名
	void setName(string name)
	{
    
    
		m_Name = name;
	}
	//读(获取)姓名
	string getName()
	{
    
    
		return m_Name;
	}

	//读(获取)年龄 
	//改为可读可写 如果想修改(年龄范围必须是0~150之间)
	int getAge()
	{
    
    
		//m_Age = 0;
		return m_Age;
	}

	//改为可读可写 如果想修改(年龄范围必须是0~150之间)
	//设置年龄
	void setAge(int age)
	{
    
    
		if (age < 0 || age>150)
		{
    
    
			m_Age = 0;
			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("张三");
	p.setLover("苍井");
	p.setAge(1800);
	cout << "姓名为:" << p.getName() << endl;
	cout << "年龄为:" << p.getAge() << endl;
	//cout << "情人为:" << p.getLover() << endl; 是不可以访问的
	//p.m_Name = "张三";
	
	system("pause");
	return 0;
}

6. 案例—设计立方体类

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

/*设计立方体类(Cube)
  求出立方体的面积和体积
  分别用全局函数和成员函数判断两个立方体是否相等*/

/*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 (m_L == c.getL() && m_W == c.getW() && m_H == 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(11);

	//利用全局函数判断
	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;
}

7. 点和圆的关系

设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系
点到圆心的距离 == 半径  点在圆上
点到圆心的距离 > 半径   点在圆外
点到圆心的距离 < 半径   点在圆内
#include <iostream>
using namespace std;

/*设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系
  点到圆心的距离 == 半径  点在圆上
  点到圆心的距离 > 半径   点在圆外
  点到圆心的距离 < 半径   点在圆内*/
//点类
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;
}

猜你喜欢

转载自blog.csdn.net/qq_45923342/article/details/105651096