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
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等。
#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;
}
封装案例2
点和圆的关系
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
注:上图转自黑马程序员免费教学视频
circle.h
#pragma once
#include <iostream>
using namespace std;
#include "point.h"
//圆类
class Circle
{
public:
//设置半径
void setR(int r);
//获取半径
int getR();
//设置圆心
void setCenter(Point ¢er);
//获取圆心
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 ¢er)
{
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;
}
自行设计一个案例
一个球类和一个点类,设计2个球,计算这2个球的关系。1、接触;2、碰撞;3、独立
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;
}