C++深入探索类和对象之封装及class与struct的区别
目录
- 封装的意义
- 访问权限
- class和struct的区别
- 成员属性私有
- 案例练习
封装的意义
封装是C++三大面向对象之一
意义:
1、设计类的时候,属性和行为写在一起,表现事物
2、类在设计时,可以把属性和行为放在不同的权限下,加以控制
语法:class 类名 {访问权限:属性 / 行为};
示例1:设计一个直角三角形,并求解他的面积
#include<iostream> using namespace std; //class代表设计一个类,后面跟着的是类名 class taiAngle { public: //访问权限 公共的权限 //属性 int m_a;//直角边a int m_b;//直角边b //行为 //获取三角形面积 double calculate() { return (m_a*m_b)/2; } }; int main() { //通过三角形类,创建三角形的对象 // c1就是一个具体的三角形 taiAngle c1; c1.m_a = 10; //给三角形两边进行赋值操作 c1.m_b = 10; cout << "三角形的面积为: " << c1.calculate() << endl;//调用方法 system("pause"); return 0; }
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,显示学生的姓名和学号
//学生类 class Student { public: void setName(string name) { m_name = name; } void setID(int id) { m_id = id; } void showStudent() { cout << "name:" << m_name << " ID:" << m_id << endl; } private: string m_name; int m_id; }; int main() { Student stu; stu.setName("马可波罗"); stu.setID(250); stu.showStudent(); system("pause"); return 0; }
在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入“stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看
访问权限
public 公共权限:
成员:类内可以访问,类外可以访问
任何一种继承,子类可以访问父类的公共成员
保护权限protected
成员:类内可以访问,类外不可以访问
任何一种继承,子类可以访问父类的保护成员
私有权限private
成员:类内可以访问,类外不可以访问。
任何一种继承,子类不可以访问父类的私有成员
示例:
class Person { //姓名 公共权限 public: string m_Phone; //手机 保护权限 protected: string m_Phone; //银行卡密码 私有权限 private: int m_Password; public: void display(); }; void Person::display() { m_Name = "张三"; m_Phone = "华为"; m_Password = 123456; } int main() { Person p; p.m_Name = "李四"; //p.m_Phone = "iPhone 13"; //保护权限类外访问不到 //p.m_Password = 123; //私有权限类外访问不到 system("pause"); return 0; }
这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。
class和struct的区别
在C++中 struct和class唯一的区别就在于默认的访问权限不同
class 默认权限是私有
struct 默认权限是公共
示例:
class C1 { int m_A; //默认是私有权限 }; struct C2 { int m_A; //默认是公共权限 }; int main() { C1 c1; c1.m_A = 10; //错误,访问权限是私有 C2 c2; c2.m_A = 10; //正确,访问权限是公共 system("pause"); return 0; }
class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的
成员属性私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
示例:
class Person { public: //姓名设置可读可写 void setName(string name) { m_Name = name; } string getName() { return m_Name; } //获取年龄 int getAge() { return m_Age; } //设置年龄 void setAge(int age) { if (age < 0 || age > 150) { cout << "你个大乌龟!" << endl; return; } m_Age = 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; //年龄设置 p.setAge(50); cout << "年龄: " << p.getAge() << endl; //爱人设置 p.setLover("阿尼亚"); //cout << "爱人: " << p.m_Lover << endl; //只写属性,不可以读取 system("pause"); return 0; }
当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。
案例练习
利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。
参考代码:
#include<iostream> 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 Area(int a, int b, int c) { return 2 * (a * b + a * c + b * c); } int 体积(int a, int b, int c) { return a * b * c; } bool isSameByClass(Cube& x) { if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W) { return true; } else { 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; } else { return false; } } int main() { Cube c1; c1.setH(10); c1.setL(10); c1.setW(10); Cube c2; c2.setH(10); c2.setL(10); c2.setW(10); cout << "面积为:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl; cout << "体积为:" << c1.体积(c1.getH(), c1.getH(), c1.getL()) << endl; //利用成员函数判断立方体 if (c1.isSameByClass(c2)) { cout << "两个立方体相等" << endl; } else { cout << "两个立方体不相等" << endl; } //利用全局函数判断 bool ret = isSame(c1, c2); if (ret) { cout << "两个立方体相等" << endl; } else { cout << "两个立方体不相等" << endl; } }
这是案例的源代码,是个非常基础,能练习本篇博文内容的案例,希望大家可以理解其中的代码含义
到此这篇关于C++深入探索类和对象之封装及class与struct的区别的文章就介绍到这了,更多相关C++封装内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!