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

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

封装

封装的意义

封装是C++面向对象三大特性之一
封装的意义:
1、将属性和行为作为一个整体,表现生活中的事物
2、将属性和行为加以权限控制

封装意义一:

在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{访问权限:属性/行为};

简单的例子1:圆类

#include<iostream>
using namespace std;

//圆周率
const double PI = 3.14159;

//设计一个圆类,求圆的周长
//圆求周长的公式:2*PI*半径
//class 代表设计一个类,类后面紧跟着的就是类名称
class Circle
{
	//访问权限
public:
	//属性
	int m_r;
	//行为
	//获取圆的周长
	double calculateZC()
	{
		return 2 * PI*m_r;
	}
};

int main()
{
	//通过圆类创建具体的圆(对象)
	//实例化(通过一个类 创建一个对象的过程)
	Circle c1;
	//给圆对象的属性进行赋值
	c1.m_r = 10;
	//2*PI*10
	cout << "圆的周长为:" << c1.calculateZC() << endl;
	return 0;
}

简单的例子2:人类

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

//设计一个人类,属性有姓名,性别,年龄,身高,体重
//设计人类
class People
{
public:
	//属性
	string m_Name;//姓名
	string m_sex;//性别
	int m_age;//年龄
	int m_height;//身高
	int m_weight;//体重
	//行为
	//显示个人信息
	void showPeople()
	{
		cout << "姓名:" << m_Name << " 性别:" << m_sex << " 年龄:" << m_age
			<< " 身高:" << m_height << " 体重:" << m_weight << endl;
	}
	//给姓名赋值
	void setName(string name)
	{
		m_Name = name;
	}
};

int main()
{
	//创建一个具体的人类 实例化对象
	People p1;
	//给p1对象 进行属性的赋值操作
	//p1.m_Name = "张三";
	p1.setName("张三");
	p1.m_sex = "男";
	p1.m_age = 33;
	p1.m_height = 170;
	p1.m_weight = 70;
	People p2;
	//给p2对象 进行属性的赋值操作
	//p2.m_Name = "李四";
	p2.setName("李四");
	p2.m_sex = "女";
	p2.m_age = 26;
	p2.m_height = 162;
	p2.m_weight = 50;
	//显示人类信息
	p1.showPeople();
	p2.showPeople();
	return 0;
}

类中的属性和行为 我们统一称为 成员
属性 成员属性 成员变量
行为 成员函数 成员方法

封装意义二:

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

1、public 公共权限 成员类内可以访问 类外可以访问
2、protected 保护权限 成员类内可以访问 类外不可以访问 儿子也可以访问父亲中的保护内容
3、private 私有权限 成员类内可以访问 类外不可以访问 儿子不可以访问父亲的私有内容

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

//访问权限
//1、public 公共权限         成员类内可以访问         类外可以访问
//2、protected 保护权限   成员类内可以访问         类外不可以访问  儿子也可以访问父亲中的保护内容
//3、private 私有权限       成员类内可以访问         类外不可以访问   儿子不可以访问父亲的私有内容
class People
{
public:
	//属性
	string m_Name;//姓名
protected:
	string m_sex;//性别
private:
	int m_age;//年龄
	int m_height;//身高
	int m_weight;//体重

public:
	void func()
	{
		m_Name = "张三";
		m_sex = "男";
		m_age = 33;
		m_height = 170;
		m_weight = 70;
	}

private:
	void func2()
	{
		m_Name = "李四";
		m_sex = "女";
		m_age = 26;
		m_height = 162;
		m_weight = 50;
	}
};

int main()
{
	People p1;
	p1.m_Name = "赵四";
	//p1.m_sex = "女";保护权限的内容在类外访问不到
	//p1.m_age = 26;私有权限内容,类外访问不到
	People p2;
	p2.func();
	//p2.func2();无法访问
	return 0;
}

struct和class区别

在C++中struct和class唯一的区别就在于默认的访问权限不同
区别:
1、struct默认权限为公共
2、class默认权限为私有

#include<iostream>
using namespace std;

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

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

int main()
{
	C1 c1;
	//c1.m_A;//无法访问
	C2 c2;
	c2.m_A = 10;
	return 0;
}

成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性(比如检测年龄是否正常)

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

class Person
{
public:
	//设置姓名
	void setName(string name)
	{
		m_Name = name;
	}
	//获取姓名
	string getName()
	{
		return m_Name;
	}
	//获取年龄  只读
	int getAge()
	{
		m_Age = 0;//初始化为0岁
		return m_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;
	cout << "年龄为:" << p.getAge() << endl;
	p.setLover("苍井");
	return 0;
}

封装案例

封装案例1

设计立方体
类名:Cube
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。
第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP

#include<iostream>
using namespace std;

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(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;
	}
	return 0;
}

第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP

封装案例2

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

第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP
第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP
注:上图转自黑马程序员免费教学视频

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;//圆心
};

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

circle.cpp

#define _CRT_SECURE_NO_WARNINGS 1

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

porint.cpp

#define _CRT_SECURE_NO_WARNINGS 1

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

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
#include "circle.h"
#include "point.h"

//判断点和圆的关系
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);
	return 0;

}

第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP

自行设计一个案例

一个球类和一个点类,设计2个球,计算这2个球的关系。1、接触;2、碰撞;3、独立

第九十二天学习记录:C++核心:类和对象Ⅰ(五星重要)-LMLPHP

ball.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"

class Ball
{
public:
	void setR(int r);
	void setCenter(Point center);
	int getR();
	Point getCenter();
private:
	int m_R;
	Point m_Center;
};

point.h

#pragma once
#include <iostream>
using namespace std;

class Point
{
public:
	void setX(int x);
	void setY(int y);
	void setZ(int z);
	int getX();
	int getY();
	int getZ();
private:
	int m_X;
	int m_Y;
	int m_Z;
};

ball.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "ball.h"

void Ball::setR(int r)
{
	m_R = r;
}
void Ball::setCenter(Point center)
{
	m_Center = center;
}
int Ball::getR()
{
	return m_R;
}
Point Ball::getCenter()
{
	return m_Center;
}

point.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "point.h"

void Point::setX(int x)
{
	m_X = x;
}
void Point::setY(int y)
{
	m_Y = y;
}
void Point::setZ(int z)
{
	m_Z = z;
}
int Point::getX()
{
	return m_X;
}
int Point::getY()
{
	return m_Y;
}
int Point::getZ()
{
	return m_Z;
}

main.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include "point.h"
#include "ball.h"

void istouch(Ball &b1, Ball &b2)
{
	int distance =
		(b1.getCenter().getX() - b2.getCenter().getX())*(b1.getCenter().getX() - b2.getCenter().getX()) +
		(b1.getCenter().getY() - b2.getCenter().getY())*(b1.getCenter().getY() - b2.getCenter().getY()) +
		(b1.getCenter().getZ() - b2.getCenter().getZ())*(b1.getCenter().getZ() - b2.getCenter().getZ());
	int rDistance = (b1.getR()+b2.getR())*(b1.getR() + b2.getR());
	if (distance == rDistance)
	{
		cout << "两球接触" << endl;
	}
	else if (distance > rDistance)
	{
		cout << "两球独立" << endl;
	}
	else
	{
		cout << "两球碰撞" << endl;
	}
}

int main()
{
	Point center1;
	center1.setX(0);
	center1.setY(0);
	center1.setZ(0);
	Point center2;
	center2.setX(0);
	center2.setY(0);
	center2.setZ(10);

	Ball ball1;
	ball1.setR(7);
	ball1.setCenter(center1);
	Ball ball2;
	ball2.setR(3);
	ball2.setCenter(center2);

	istouch(ball1, ball2);

	return 0;
}
07-01 12:41