目录
4.1封装
4.1.1封装的意义
4.1.3 成员属性私有化
c++面向对象的三大特性:封装、继承、多态
万事万物都皆为对象,对象上有其属性和行为
封装是面向对象的三大特性之一
封装的意义:
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法 class 类名{ 访问权限 :属性/行为};
#include
using namespace std;
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2*pi*半径
//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;
}
属性的话同常是对变量进行设置,行为的话通常是设计函数
在有了类之后,要对其进行实例化,即通过一个类创建一个对象
实例练习:
设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,也可以展示学生的姓名学号。
#include
using namespace std;
#include
class student
{
//访问权限
public:
//属性
string name;
int schnum;
//行为
void giveval(string a, int b)//最初使用的char结果只能传入一个字母,后看视频后改为string;
{
name = a;
schnum = b;
}
//显示学生信息
void showstu()
{
cout << "学生姓名为" << name << endl;
cout << "学生学号为" << schnum << endl;
}
};
int main()
{
student s1;
s1.giveval("小明", 2);
s1.showstu();
system("pause");
return 0;
}
封装的意义2
访问权限:
公共权限 public 成员 类内可以访问 类外可以访问
保护权限 protected 成员 类内可以访问 类外不可以访问 儿子可以访问父亲中的保护内容
私有权限 private 成员 类内可以访问 类外不可以访问 儿子不可以访问父亲的私有内容
#include
using namespace std;
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 p1;
p1.m_Name = "李四";
//p1.m_Car = "奔驰";//保护权限 类外不可以访问
system("pause");
return 0;
}
struct 和 class的区别
#include
using namespace std;
#include
//成员属性设置为私有
//对于写权限 可以检测数据有效性
class Person
{
private:
string m_Name;//姓名 可读可写
int m_Age;//年龄 可读
string m_Lover;//情人 可写
public:
void set_Name(string name)
{
m_Name = name;
}
string get_Name()
{
return m_Name;
}
//获取年龄 可读 可写
int get_Age()
{
//m_Age = 21;
return m_Age;
}
//设置年龄
void set_Age(int age)
{
if (age < 0 || age>150)
{
m_Age = 0;
cout << "你这个老妖精!" << endl;
return;
}
else m_Age = age;
}
//设置情人 姓名 可写
void set_Lover(string lover)
{
m_Lover = lover;
}
};
int main()
{
Person c1;
c1.set_Name("张三");
cout<<"姓名为:"<
练习题:
计算立方体体积和表面积,分别用全局函数和成员函数来判断两个立方体是否相同。
#include
using namespace std;
//立方体类设计
class cube
{
//设置属性 长宽高
private:
int m_l;
int m_w;
int m_h;
//行为:获取长宽高,计算面积,计算体积
public:
void set_l(int l)
{
if (l <= 0)
{
cout << "长度输入有误" << endl;
return;
}
m_l = l;
}
int getL()
{
return m_l;
}
void set_w(int w)
{
if (w <= 0)
{
cout << "宽度输入有误" << endl;
return;
}
m_w = w;
}
int getW()
{
return m_w;
}
void set_h(int h)
{
if (h <= 0)
{
cout << "高度输入有误" << endl;
return;
}
m_h = h;
}
int getH()
{
return m_h;
}
//计算面积
int calarea()
{
return 2 * (m_l*m_w + m_l * m_h + m_w * m_h);
}
//计算体积
int calvol()
{
return m_l * m_w*m_h;
}
//局部函数判断两长方体体积是否相等
bool issamebyclass(cube &c)
{
if ((getL() == c.getL()) && (getW() == c.getW()) && (getH() == c.getH()))
return true;
else return false;
}
};
//全局函数判断长方体是否相等
bool issame(cube &c1, cube &c2)
{
if ((c1.getL() == c2.getL()) && (c1.getW() == c2.getW()) && (c1.getH ()== c2.getH()))
{
return true;
}
else return false;
}
int main()
{
cube c1;
cube c2;
c1.set_h(5);
c1.set_l(13);
c1.set_w(14);
cout << "立方体1的面积为:" << c1.calarea() << endl;
cout << "立方体1的体积为:" << c1.calvol() << endl;
c2.set_h(5);
c2.set_l(12);
c2.set_w(14);
cout << "立方体2的面积为:" << c2.calarea() << endl;
cout << "立方体2的体积为:" << c2.calvol() << endl;
bool ret=issame(c1, c2);
if (ret)
{
cout << "全局函数判断长方体相等" << endl;
}
else cout << "全局函数判断长方体不相等" << endl;
bool res= c1.issamebyclass(c2);
if (res)
cout << "局部函数判断长方体相等" << endl;
else
cout << "局部函数判断长方体不相等" << endl;
system("pause");
return 0;
}
案例2 点和圆的关系的案例
分析:点和圆的关系,无非就三种:
创建圆类和点类,创建全局函数用来判断点和圆的关系
文件point.h
#pragma once
#include
using namespace std;
class Point
{
public:
//设置x 获取x 设置y 获取y
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_X;
int m_Y;
};
文件point.cpp
#include "point.h"
void Point::setX(int x)
{
m_X = x;
}
int Point::getX()
{
return m_X;
}
void Point::setY(int y)
{
m_Y = y;
}
int Point::getY()
{
return m_Y;
}
文件circle.h
#pragma once
#include "point.h"
#include
using namespace std;
class Circle
{
public:
//设置半径
void setR(int r);
int getR();
//设置圆心
void set_Center(Point center);
//获取圆心
Point get_Center();
//成员属性 圆心和半径
private:
int m_R;
Point m_Center;
};
文件circle.app
#include"circle.h"
void Circle::setR(int r)
{
m_R = r;
}
int Circle::getR()
{
return m_R;
}
//设置圆心
void Circle::set_Center(Point center)
{
m_Center = center;
}
//获取圆心
Point Circle::get_Center()
{
return m_Center;
}
//成员属性 圆心和半径
主函数
#include
using namespace std;
#include"circle.h"
#include"point.h"
//点和圆的关系
//圆类
//class Point
//{
//public:
// //设置x 获取x 设置y 获取y
// void setX(int x)
// {
// m_X = x;
// }
// int getX()
// {
// return m_X;
// }
// void setY(int y)
// {
// m_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 set_Center(Point center)
// {
// m_Center = center;
// }
// //获取圆心
// Point get_Center()
// {
// return m_Center;
// }
// //成员属性 圆心和半径
//private:
// int m_R;
// Point m_Center;
//};
//判断点和圆的关系
void isInCircle(Circle &c, Point &p)
{
int distance =
(c.get_Center().getX() - p.getX())*(c.get_Center().getX() - p.getX())
+ (c.get_Center().getY() - p.getY())*(c.get_Center().getY() - p.getY());
int squareR =
c.getR()*c.getR();
if (distance == squareR)
{
cout << "点在圆上" << endl;
}
else if (distance > squareR)
cout << "点在圆外" << endl;
else
cout << "点在圆内" << endl;
}
int main()
{
Circle c1;
Point center;
c1.setR(10);
center.setX(10);
center.setY(0);
c1.set_Center(center);
Point p1;
p1.setX(10);
p1.setY(5);
isInCircle(c1,p1);
system("pause");
return 0;
}