初始封装

来源:互联网 发布:linux echo 编辑:程序博客网 时间:2024/06/05 14:53

----------------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");

return0;

}

  

  

  

程序 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");

return0;

}

  

//设置对象的数据成员

stu->setName("siwuxie095");

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

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

  

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

delete stu;

stu = NULL;

  

system("pause");

return0;

}

  

  

  

  

  

  

  

  

  

【made by siwuxie095】

0 0
原创粉丝点击