----------------siwuxie095
数据的封装
以
学生
为例定义一个类:
有两个数据成员:一个
string 型的姓名,一个 int 型的年龄
通过对象直接访问数据成员的用法是有问题的,违背了面向对象的指导思想
面向对象的基本思想
面向对象的基本思想就是以对象为中心,具体来说就是要以
谁做什么
来表达程序的逻辑
体现到代码层面就是将所有的
数据操作
转化为
成员函数的调用
换句话说,对象在程序中的所有行为,都通过调用自己的函数来完成
如:通过函数来封装数据成员
数据成员定义在
private 下边,这里以 age 为例在 public 中定义两个成员函数
直接用数据成员赋值的方法,虽然方便,但弊端很多,如:出现非法赋值
而数据封装虽然看上去比较麻烦,但好处非常多,如:通过 数据封装 便能
很好的解决像上面的非法赋值问题
只需将 setAge() 略作改变,就能对传入进来的参数起到条件限制的作用
此外,对于有些数据成员来说,只希望这些数据被外界读取,而不希望被外界改变
即
只能读不能写
以 汽车 为例定义一个类:
private 下边的数据成员代表汽车轮子的个数
对于汽车轮子的个数,不希望外界通过某一个函数去改变它的值,而只能读取它的值
「只能读取不能写入的属性
即
只读属性」
程序 1:
#include <stdlib.h> #include<iostream> #include <string> using namespace std; /**********************************************************/ /* 数据的封装 定义一个Student类,含有如下信息: 1.姓名:name 2.性别:gender 3.学分(只读):score 4.学习:study (学习可以增加学分)*/ /**********************************************************/ class Student { //一般将 public 写在前边,private 写在后边 public: void setName(string _name) { m_strName = _name; } string getName() { return m_strName; } void setGender(string _gender) { m_strGender = _gender; } string getGender() { return m_strGender; } int getScore() { return m_iScore; } void initScore()//初始化学分 { m_iScore = 0; } void study(int _score) { m_iScore += _score; } private: //数据成员的命名要求:m+下划线+数据类型+名字 //命名的好处:每次看到它就知道它是定义在类中的数据成员 string m_strName; string m_strGender; int m_iScore; }; int main(void) { Student stu; stu.initScore();//如果不初始化 stu.setName("Marry"); stu.setGender("女"); stu.study(5);//先修了5个学分 stu.study(3);//再修了3个学分 cout << stu.getName() << " " << stu.getGender() << " " << stu.getScore() << endl; system("pause"); return } |
程序 2:
#include<stdlib.h> #include <iostream> #include <string> using namespace std; /** * 定义类:Student * 数据成员:m_strName * 数据成员的封装函数:setName()、getName() */ class Student { public: // 定义数据成员封装函数setName() void setName(string name) { m_strName = name; } // 定义数据成员封装函数getName() string getName() { return m_strName; } private: //定义Student类私有数据成员m_strName string m_strName; }; int main() { // 使用new关键字,实例化对象(在堆中实例化对象) //也可以 Student *stu = new Student; 去掉括号 Student *stu = new Student(); if (NULL==stu) { system("pause"); return } // 设置对象的数据成员 stu->setName("siwuxie095"); // 使用cout打印对象str的数据成员 cout << stu->getName() << endl; // 将对象str的内存释放,并将其置空 delete stu; stu = NULL; system("pause"); return } |
【made by siwuxie095】