Fork me on GitHub

初始封装

----------------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 0;

}

   

   

   

程序 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 0;

}

   

// 设置对象的数据成员

stu->setName("siwuxie095");

// 使用cout打印对象str的数据成员

cout << stu->getName() << endl;

   

// 将对象str的内存释放,并将其置空

delete stu;

stu = NULL;

   

system("pause");

return 0;

}

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

posted on 2017-04-16 16:36  siwuxie095  阅读(213)  评论(0编辑  收藏  举报

导航