个人网站建设流程,网站里图片做超链接,解决方案海外推广,简单网页制作代码模板目录
前言
封装
封装的意义
struct 和 class 的区别
成员属性设置为私有
前言
众所周知#xff0c; C是一个面向对象的编程语言#xff08;面向对象的C语言的特点就是#xff1a;封装、继、 多态#xff09;#xff0c;它与面向过程的C语言不通#xff0c;对面向…目录
前言
封装
封装的意义
struct 和 class 的区别
成员属性设置为私有
前言
众所周知 C是一个面向对象的编程语言面向对象的C语言的特点就是封装、继、 多态它与面向过程的C语言不通对面向过程的初级认识就是他强调的是一个过程这样说是不是还是很空洞下面举个例子就会好理解很多
在面向过程中把大象装进冰箱需要3步打开冰箱门把大象放进去再关上冰箱强调的是一个求解问的步骤
在面向对象中把大象和冰箱看作两个对象然后通过操作两个对象来把大象放到冰箱里。关注的是对象将一件事情拆分成不同的对象靠对象之间的交互完成。 再比如一个选课系统面向过程选课、上课 两个过程面向对象学生、老师 关注的是两个类对象之间的关系 在C中万事万物皆为对象对象有属性和行为 例如 人可以作为对象属性有姓名、年龄、性别、身高...行为有走、跑、跳、吃饭... 车也可以作为对象属性有轮胎、方向盘、车灯...行为有载人、放音乐、放空调... 具有相同性质的对象我们可以抽象成为类人属于人类车属于车类 封装
封装的意义
封装是C面向对象三大特点之一它的主要意义就是在于将对象的属性和行为作为一个整体来表现我们的对象另外就是对属性和行为进行权限的控制
它的语法是class 类名{ 访问权限属性 / 行为 } class为定义类的关键字
下面定义一个圆类求圆的周长
#includeiostream
using namespace std;const double PI 3.14
//设计一个类
class Circle
{//访问权限public: //公共权限//属性通常就是一些变量int m_r; //半径//行为通常用函数来获取double calculateZC() //获取圆的周长{return 2*PI*m_r;}
};int main()
{//通过圆类 实例化一个具体的圆对象Circle cl; // Circle是先前创建的类 cl是具体的圆对象//给圆对象的属性进行赋值cl.m_r 10; //通过 . 来获取属性 并进行赋值cout 圆的周长为 cl.calculateZC endl;system(pause);return 0;
}
以上代码就是设计一个圆类class Circle在这个圆类中定义了属性半径m_r以及通过函数double calculateZC创建一个求解圆周长的行为并且在主函数中通过圆类实例化了一个具体的圆对象 Circle cl来访问我们的类cl就是我们的是实例化对象要获取属性就要使用到“.”点这个符号通过cl.m_r来获取半径同时进行赋值同样获取周长就是cl.calculate。 那么为加深对类设计的认识下面再来一个例子设计一个学生类属性有姓名和学号可以给姓名和学号赋值可以显示学生的姓名和学号 #includeiostream
using namespace std;
#includestring//设计一个学生类
class Student
{//访问权限public: //公共权限//属性通常就是一些变量string m_Name; //姓名string m_Id; //学号//行为通常用函数来获取void setName(string name) //获取学生姓名{m_Name name;}void setId(int id) //获取学生学号{m_Id id;}void showStudent() //显示学生信息{cout 姓名 m_Name 学号 m_Id endl;}//除了通过在主函数里面复制的方式还可以用函数在类的行为来进行赋值void setName(string name) //给学生姓名赋值{m_Name name;} };int main()
{//通过学生类 实例化一个具体的学生对象Student stu1; //给学生1对象的属性进行赋值stu1.m_Name 张三; stu1.m_Id 123456789;stu1.showStudent//给学生2对象的属性进行赋值stu2.m_Name 李四; stu2.m_Id 1234567890;stu2.showStudent//通过行为对学生姓名进行赋值stu1.setName(张三)system(pause);return 0;
} 注意 类中的属性和行为统称为 成员 属性 也称为 成员属性 或 成员变量 行为 也称为 成员函数 或 成员方法 在上面代码中我们发现 每次都会在属性和行为前面进行权限的限制public这是因为在设计类时属性和行为放在不同的权限下访问权限有三种public公共权限、protected保护权限、private私有权限。下面一段代码进行详细解释 公共权限public类内可以访问类外可以访问保护权限protected类内可以访问类外不可以访问 子类可以访问父类中的保护内容私有权限private类内可以访问类外不可以访问子类不可以访问父类中的私有内容 #includeiostream
using namespace std;
#includestring//设计一个类
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 123456; //此时这里会出现错误 因为银行卡密码这个属性是保私有权限不能在类外访问system(pause);return 0;
}
struct 和 class 的区别 在C中struct 和 class 的唯一区别就在于 默认的访问权限不同struct默认访问权限为公共的class的默认访问权限为私有的。
#includeiostream
using namespace std;
#includestring//设计一个类
class C1
{string m_Name;//当我们不定义权限的时候默认是私有权限
};
//定义一个结构体
struct S1
{string m_Name;//当我们不定义权限的时候默认是共有权限
};int main()
{C1 c1;//不能进行访问因为class的默认权限是私有的类的外部不能访问S1 s1;//能进行访问因为struct的默认权限是共有的类的外部也能访问system(pause);return 0;
}
成员属性设置为私有
通过使用私有成员属性可以实现类的封装隐藏内部实现细节并提供对外部世界的受控访问。这有助于提高代码的模块化程度减少代码的耦合性同时也方便了代码的维护和重构。将成员属性设置为私有有以下优点
优点 1将所有的成员属性设置为私有可以自己控制读写权限
优点 2对于写权限我们可以检测数据的有效
#includeiostream
using namespace std;
#includestringclass Person
{
bublic:void setName(string name) //写操作{m_Name name;}string getName(string name) //读操作{return m_Name;}void setAge(int age) //写操作{m_Age age;}string getIdol(string idol) //读操作{return m_Idol;}privatestring m_Name;// 可读可写int m_Age; //只写不读string m_Idol; //只读不写};int main()
{Person p;p.setName(张三);//写操作cout 姓名 p.getName() endl; //读操作p.setAge(18);//写操作cout 年龄 p.m_Age endl; //读操作,此时会发生错误因为我们只给了写的权限p.m_Idolse;//写操作,此时会发生错误因为我们没有给写的权限cout 年龄 p.getIdol() endl; //读操作system(pause);return 0;
}
上面这段代码可以看看出来我们的定义了私有属性name、age、idol 私有权限在类外是不能访问的现在我们想要进行访问进行读和写操作于是我们就定个公有权限的读写函数来获取写就是setxxx(例如setName)读就是getxxx(例如getName)对于我们定义的几个属性我们只想外部写更改年龄但是不想外部读取年龄此时就只需要定义一个setAge函数来对年龄进行更改而对于偶像Idol我们只想外部进行读操作并不能对它进行写操作也就是更改Idol的姓名此时就只需要一个getIdol函数来返回我们偶像名字并且在主函数中进行打印这样外界就知道了这个人的idol是谁了如果又读又写就两个函数都定义一个然后在主函数进行调用。以上就是将所有的成员属性设置为私有可以自己控制读写权限。
对于写权限我们可以检测数据的有效可以举个例来说明就是说 我们在写入年龄的时候可以进行判断输入的年龄是否符合规定比如我们在写函数setAge()中添加一个判断语句来设置输入的年龄应该是0到100之间如果写入的年龄超过100或低于0那么就是无效的。
#includeiostream
using namespace std;
#includestringclass Person
{
bublic:void setAge(int age) //写操作{if (age 0 || age 100){cout 年龄 age 输入数字无效赋值失败 endl;return;}m_Age age;}privatestring m_Name;// 可读可写int m_Age; //只写不读 只能在0-100之间string m_Idol; //只读不写};int main()
{Person p;p.setAge(180);//写操作cout 年龄 p.m_Age endl; //读操作,此时会发生错误因为我们只给了写的权限system(pause);return 0;
}