四.类和对象
1.封装
意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
1.意义一:
- 在设计类的时候,属性和行为写在一起,表现事物
- 语法:class 类名(访问权限:属性 / 行为);
-
说明
- 属性:成员属性 成员变量
- 行为:成员函数 成员方法
示例:设计一个圆类,求圆的周长
#include<iostream>
using namespace std;
//公式:C=π*半径*2
const double PI = 3.14;
//class 代表设计一个类,类后面紧跟着的是类的名称
class yuan
{
//访问权限;公共权限
public:
//属性--半径
int m_r;
//行为--获取圆的周长(行为通常用函数)
double calculateZC()
{
return 2 * PI * m_r;
}
};
int main()
{
//通过圆类 来创建一个具体的圆(对象)
yuan c;
//给圆对象 的属性进行赋值
c.m_r = 10;
//C=2*PI*10=62,8;
cout << "圆的周长为:" << c.calculateZC() << endl;
system("pause");
return 0;
}
示例二:
设计一个学生类,属性:姓名和学号(可以给姓名和学号赋值可以显示学生的姓名和学号)
#include<iostream>
using namespace std;
//公式:C=π*半径*2
const double PI = 3.14;
//class 代表设计一个类,类后面紧跟着的是类的名称
class student
{
public://公共权限
//属性
string name;//姓名
int num;//学号
//行为
//显示学生信息
void showstudent()
{
cout << "姓名:" << name <<endl<< "学号:" << num << endl;
}
//输入学生姓名
void setname(string n)
{
name = n;
}
//输入学生学号
void setnum(int m)
{
num = m;
}
};
int main()
{
student A;//创建一个学生
A.name = "张三";//给姓名赋值
A.num = 1;//给学号赋值
A.showstudent();//显示学生信息
student B;
B.setname("李四");//给姓名赋值
B.setnum(2);//给学号赋值
B.showstudent();//显示学生信息
system("pause");
return 0;
}
2.意义二
- 类在设计时,可以把属性和行为放在不同的权限下,加以控制
- 访问权限有三种
- public 公共权限 成员 类内可以访问 类外也可以访问
- protected 保护权限 成员 类内可以访问 类外不可以访问 子可以访问父中保护内容
- private 私有权限 成员 类内可以访问 类外不可以访问 子不可以访问父中私有内容
#include<iostream>
using namespace std;
class person
{
public://公共权限
string p_name;//名字
protected://保护权限
string p_car;//汽车
private://私有权限
int p_password;//银行卡密码
public:
void fun()
{
p_name="张三";
p_car = "拖拉机";
p_password = 123456;
}
protected:
void fun1()
{
p_name = "陈无";
p_car = "货车";
p_password = 234567;
}
};
int main()
{
person A;
A.p_name = "李四";
//A.p_car = "奔驰";//保护权限在类外访问不到
//A.p_password = 234567;//私有权限在类外也访问不到
A.fun();
//A.fun1();//保护权限的函数不可以访问
system("pause");
return 0;
}
二.struct和class的区别
在C++中,struct和class唯一区别就是默认访问权限不同
区别:
- struct默认权限为公共
- class默认权限为私有
-
#include<iostream> using namespace std; class person { string name; }; struct student { int num; }; int main() { person A; student B; //A.name = "张三";//报错,class默认为私有权限,类外不可以访问 B.num = 1; system("pause"); return 0; }
三.成员属性设置为私有化
本质就是创建一个借口,接通类外和类内的私有和保护权限
- 优点一:将所有成员属性设置为私有,可以自己控制读写权限
- 优点二:对于写权限,我们可以检测数据的有效性
#include<iostream>
using namespace std;
#include<string>
class person
{
public: //接口:接通类外与类内的保护和隐私权限
//写姓名
void setname(string name)
{
m_name = name;
}
//读姓名
string getname()
{
return m_name;
}
//读年龄
int getnum()
{
m_num = 0;
return m_num;
}
//读爱人
string setlover(string lover)
{
m_lover = lover;
}
private:
string m_name;//姓名 可读可写
int m_num;//年龄 只读
string m_lover;//爱人 只写
};
int main()
{
person A;
A.setname("张三");//成功写入A的姓名
cout << "A`s name:" << A.getname() << endl;//读取A的名字
cout << "A`s num:" << A.getnum() << endl;//读取A的年龄
A.setlover("艾伦");//写入A的爱人
system("pause");
return 0;
}
案例:设计立方体类
- 设计立方体类
- 求出立方体的面积和体积
- 分别用全局函数和成员函数判断两个立方体是否相等
#include<iostream>
using namespace std;
#include<string>
//创建一个立方体的类
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 gets()
{
return 2*(m_l*m_w+m_l*m_h+m_w*m_h);
}
// 获取立方体体积
int getv()
{
return m_l * m_w * m_h;
}
//利用成员函数判断两个函数
bool Issamebyclass(cube s_2)
{
if (m_l == s_2.getl() && m_w == s_2.getw() && m_h == s_2.geth())
{
return true;
}
return false;
}
//属性
private:
int m_l;
int m_w;
int m_h;
};
//判断两个立方体是否相等 分别利用全局函数和成员函数
bool Issame(cube s_1,cube s_2)
{
if (s_1.getl() == s_2.getl() && s_1.getw() == s_2.getw() && s_1.geth() == s_2.geth())
{
return true;
}
return false;
}
int main()
{
cube s_1;
s_1.seth(10);
s_1.setl(10);
s_1.setw(10);
cout << "长方体的面积" << s_1.gets() << endl;
cout << "长方体的体积" << s_1.getv() << endl;
//创建第二个立方体
cube s_2;
s_2.seth(11);
s_2.setl(8);
s_2.setw(9);
bool ret = Issame(s_1, s_2);//利用全局函数判断两个立方体是否相等
if (ret)
{
cout << "全局函数判断:s_1和s_2相等" << endl;
}
cout << "全局函数判断s_1和s_2不相等" << endl;
//成员函数判断立方体是否相等
ret = s_1.Issamebyclass(s_2);
if (ret)
{
cout << "成员函数判断:s_1和s_2相等" << endl;
}
cout << "成员函数判断s_1和s_2不相等" << endl;
system("pause");
return 0;
}