C++自学笔记(13 类和对象_封装)
13 类和对象_封装
本次记录13类和对象–封装,还请各位大佬批评指正!
类和对象
C++面向对象的三大特性:封装、继承、多态。
C++认为万事万物都为对象,对象有其属性和行为。例如:
人可以作为对象,属性有姓名,年龄,身高,体重… ; 行为有走,跑,跳,吃饭,唱歌…
车可以作为对象,属性有轮胎,方向盘,车灯… ; 行为有载人,放音乐,开空调…
具有相同性质的对象,我们可以称之为类,人属于人类,车属于车类。
封装
封装是C++面向对象三大特性之一。
封装的意义:
1、将属性和行为作为一个整体,表现生活中的事物;
2、将属性和行为加以权限控制。
封装的意义一
在设计类的时候,属性和行为写在一起,表现事物。
语法:class 类名 { 访问权限: 属性 / 行为 };
示例一:设计一个圆类,求圆的周长。
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
const double PI = 3.14;
//设计一个圆类,求圆的周长 2 * PI * R
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<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
//设计学生类
class student
{
//权限
public://公共权限
//类中的属性和行为我们统一称为成员
//属性 成员属性/成员变量
string s_name;
int s_num;
//行为 成员函数/成员方法
//显示姓名和学号
void showstudent()
{
cout << "姓名:" << s_name << "学号:" << s_num << endl;
}
//给姓名赋值
void setname(string name)
{
s_name = name;
}
//给学号赋值
void setnum(int num)
{
s_num = num;
}
};
int main()
{
//创建一个具体的学生 实例化对象
student s1;
//给s1对象进行赋值操作
s1.s_name = "张三";
s1.s_num = 1;
//显示学生信息
s1.showstudent();
student s2;
//给s1对象进行赋值操作
s2.setname("李四");
s2.setnum(2);
//显示学生信息
s2.showstudent();
system("pause");
return 0;
}
封装的意义二
类在实际时,可以把属性和行为放在不同的权限下,加以控制。
三种权限:
1、公共权限: public 成员 类内可以访问,类外也可以访问。
2、保护权限: protected 成员 类内可以访问,类外不可以访问( 儿子可以访问父亲的保护内容)。
3、私有权限: private 成员 类内可以访问,类外不可以访问(儿子不可以访问父亲的私有内容)。
#include<iostream>
#include <stdlib.h>
#include<string>
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 = "拖拉机";/保护权限内容,类外访问不到
//p1.m_password = 123;//私有权限内容,类外访问不到
p1.func();
system("pause");
return 0;
}
struct和class的区别
C++中struct和class唯一区别在于:默认的访问权限不同。struct默认权限为公共;class默认权限为私有。
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
class c1
{
int m_a;//默认权限 私有
};
struct c2
{
int m_b;//默认权限 公共
};
int main()
{
c1 C1;//class 私有,类外不可访问
//C1.m_a = 10;
c2 C2;//struct 公共,类外可以访问
C2.m_b = 10;
system("pause");
return 0;
}
成员属性设为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限。
优点2:对于写权限,我们可以检测数据的有效性 。
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
//成员属性设为私有
class person
{
public:
//设置姓名
void setname(string name)
{
m_name = name;
}
//获取姓名
string getname()
{
return m_name;
}
//设置年龄
void setage(int age)
{
if (age < 0 || age>150)//判断有效性
{
m_age = 0;
cout << "输入年龄有误!" << endl;
return;
}
m_age = age;
}
//获取年龄
int getage()
{
//m_age = 20;//初始化
return m_age;
}
//设置情人
void setlover(string lover)
{
m_lover = lover;
}
private:
string m_name;//姓名 可读可写
int m_age;//年龄 可读可写 如果想修改,则范围必须是 0~150
string m_lover;//情人 只写
};
int main()
{
person p1;
p1.setname("张三");
cout << "姓名:" << p1.getname() << endl;
//p1.m_age = 18;
p1.setage(20);
cout << "年龄:" << p1.getage() << endl;
p1.setlover("苍老师");
//cout << "情人:" << p1.setlover() << endl;//不可以访问
system("pause");
return 0;
}
练习案例1:设计长方体类
要求:
设计长方体类(cube);
求出长方体的面积和体积;
分别用全局函数和成员函数判断两个长方体是否相等。
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
//练习案例1:设计长方体类
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_l * m_h + 2 * m_h * m_w;
}
//计算体积
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(20);
c1.seth(20);
cout << "c1的面积为:" << c1.calculateS() << endl;
cout << "c1的体积为:" << c1.calculateV() << endl;
cube c2;
c2.setl(10);
c2.setw(20);
c2.seth(20);
//利用全局函数判断长方体是否相等
bool ret1 = issame(c1, c2);//全局函数调用一个参数
if (ret1)
{
cout << "全局函数判断c1和c2相等" << endl;
}
else
{
cout << "全局函数判断c1和c2不相等" << endl;
}
//利用成员函数判断长方体是否相等
bool ret2 = c1.issamebyclass(c2);//成员函数调用一个参数
if (ret2)
{
cout << "成员函数判断c1和c2相等" << endl;
}
else
{
cout << "成员函数判断c1和c2不相等" << endl;
}
system("pause");
return 0;
}
练习案例2:点和圆的关系
设计一个圆形类(circle)和一个点类(point),计算点和圆的关系。
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
//点类
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(0);
center.sety(0);
c.setcenter(center);
//创建点
point p1;
p1.setx(10);
p1.sety(0);
point p2;
p2.setx(1);
p2.sety(0);
point p3;
p3.setx(10);
p3.sety(10);
//判断关系
isincircle(c, p1);
isincircle(c, p2);
isincircle(c, p3);
system("pause");
return 0;
}
练习案例2:点和圆的关系(拆分)
1、新建 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;
};
2、新建 point.cpp 文件
#include "point.h"
//设置X
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;
}
3、新建 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;
};
4、新建 circle.cpp 文件
#include "circle.h"
//快捷键 Ctrl + K + F 取消缩进
//设置半径
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;
}
#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
#include "point.h"
#include "circle.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(0);
center.sety(0);
c.setcenter(center);
//创建点
point p1;
p1.setx(10);
p1.sety(0);
point p2;
p2.setx(1);
p2.sety(0);
point p3;
p3.setx(10);
p3.sety(10);
//判断关系
isincircle(c, p1);
isincircle(c, p2);
isincircle(c, p3);
system("pause");
return 0;
}