C++类和对象之封装及class与struct的区别是什么
C++类和对象之封装及class与struct的区别是什么
本篇内容主要讲解“C++类和对象之封装及class与struct的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++类和对象之封装及class与struct的区别是什么”吧!
封装的意义
封装是C++三大面向对象之一
意义:
1、设计类的时候,属性和行为写在一起,表现事物
2、类在设计时,可以把属性和行为放在不同的权限下,加以控制
语法:class 类名 {访问权限:属性 / 行为};
示例1:设计一个直角三角形,并求解他的面积
#include<iostream>usingnamespacestd;//class代表设计一个类,后面跟着的是类名classtaiAngle{public://访问权限公共的权限//属性intm_a;//直角边aintm_b;//直角边b//行为//获取三角形面积doublecalculate(){return(m_a*m_b)/2;}};intmain(){//通过三角形类,创建三角形的对象//c1就是一个具体的三角形taiAnglec1;c1.m_a=10;//给三角形两边进行赋值操作c1.m_b=10;cout<<"三角形的面积为:"<<c1.calculate()<<endl;//调用方法system("pause");return0;}
示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,显示学生的姓名和学号
//学生类classStudent{public:voidsetName(stringname){m_name=name;}voidsetID(intid){m_id=id;}voidshowStudent(){cout<<"name:"<<m_name<<"ID:"<<m_id<<endl;}private:stringm_name;intm_id;};intmain(){Studentstu;stu.setName("马可波罗");stu.setID(250);stu.showStudent();system("pause");return0;}
在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入“stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看
访问权限
public 公共权限:
成员:类内可以访问,类外可以访问
任何一种继承,子类可以访问父类的公共成员
保护权限protected
成员:类内可以访问,类外不可以访问
任何一种继承,子类可以访问父类的保护成员
私有权限private
成员:类内可以访问,类外不可以访问。
任何一种继承,子类不可以访问父类的私有成员
示例:
classPerson{//姓名公共权限public:stringm_Phone;//手机保护权限protected:stringm_Phone;//银行卡密码私有权限private:intm_Password;public:voiddisplay();};voidPerson::display(){m_Name="张三";m_Phone="华为";m_Password=123456;}intmain(){Personp;p.m_Name="李四";//p.m_Phone="iPhone13";//保护权限类外访问不到//p.m_Password=123;//私有权限类外访问不到system("pause");return0;}
这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。
class和struct的区别
在C++中 struct和class唯一的区别就在于默认的访问权限不同
class 默认权限是私有
struct 默认权限是公共
示例:
classC1{intm_A;//默认是私有权限};structC2{intm_A;//默认是公共权限};intmain(){C1c1;c1.m_A=10;//错误,访问权限是私有C2c2;c2.m_A=10;//正确,访问权限是公共system("pause");return0;}
class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的
成员属性私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
示例:
classPerson{public://姓名设置可读可写voidsetName(stringname){m_Name=name;}stringgetName(){returnm_Name;}//获取年龄intgetAge(){returnm_Age;}//设置年龄voidsetAge(intage){if(age<0||age>150){cout<<"你个大乌龟!"<<endl;return;}m_Age=age;}//情侣设置为只写voidsetLover(stringlover){m_Lover=lover;}private:stringm_Name;//可读可写姓名intm_Age;//只读年龄stringm_Lover;//只写爱人};intmain(){Personp;//姓名设置p.setName("张三");cout<<"姓名:"<<p.getName()<<endl;//年龄设置p.setAge(50);cout<<"年龄:"<<p.getAge()<<endl;//爱人设置p.setLover("阿尼亚");//cout<<"爱人:"<<p.m_Lover<<endl;//只写属性,不可以读取system("pause");return0;}
当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。
案例练习
利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。
参考代码:
#include<iostream>usingnamespacestd;//案例1判断两个立方体是否相等classCube{public:voidsetL(intl){m_L=l;}intgetL(){returnm_L;}voidsetW(intw){m_W=w;}intgetW(){returnm_W;}voidsetH(inth){m_H=h;}intgetH(){returnm_H;}intArea(inta,intb,intc){return2*(a*b+a*c+b*c);}int体积(inta,intb,intc){returna*b*c;}boolisSameByClass(Cube&x){if(x.getH()==m_H&&x.getL()==m_L&&x.getW()==m_W){returntrue;}else{returnfalse;}}private:intm_L;intm_W;intm_H;};//利用全局函数判断,两个立方体是否相等boolisSame(Cube&c1,Cube&c2){if(c1.getL()==c2.getL()&&c1.getW()==c2.getW()&&c1.getH()==c2.getH()){returntrue;}else{returnfalse;}}intmain(){Cubec1;c1.setH(10);c1.setL(10);c1.setW(10);Cubec2;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;}//利用全局函数判断boolret=isSame(c1,c2);if(ret){cout<<"两个立方体相等"<<endl;}else{cout<<"两个立方体不相等"<<endl;}}
到此,相信大家对“C++类和对象之封装及class与struct的区别是什么”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!