封装
面对对象的基本思想,将所有的数据操作在调用成员函数操作中完成
**好处:**1.对于一些数据输入格式上无问题而违反常识的可以通过类内的函数进行限制,如下图就限制了age要在0到100之间
2.对于某些只需要输入而不需要更改的数据,在用类封装方面更好。
如下图只可以获取m_iWheelCount
,并设置m_iWheelCount
为私有属性,无法更改。
来看一个例子
#include <iostream>
#include <stdlib.h> //包含system命名空间的头文件
#include <string>
using namespace std;
class Student
{
public:
void setName(string _name) //这里带下划线的,适用于所有传进来的参数
{
m_strName=_name;
}
string getName() //将m_strName return出去
{
return m_strName;
}
void setGender(string _gender)
{
m_strGender=_gender;
}
string getGenter()
{
return m_strGender;
}
int getScore() //由于score只读,因此只有get函数
{
return m_iscore;
}
void initScore() //对score初始化
{
m_iscore=0;
}
void study(int _score) //传入_score,通过study的参数增加m_iscore的值
{
m_iscore+=_score;
}
private:
string m_strName; //这里所有的数据成员都在原来格式前加上 m_数据格式 以确定其为定义在类内的数据成员
string m_strGender;
int m_iscore;
};
int main(void)
{
Student stu;
stu.initScore(); //初始化score*/
stu.setName("1235");
stu.setGender("girl");
stu.study(5);
stu.study(3);
cout<<stu.getName()<<" "<<stu.getGenter()<<" "<<stu.getScore()<<endl;
system("pause");
return 0;
}
这里类中定义的m_iScore只是声明,没有实例化。且在private下定义的变量只有类的内部方法才能修改,一般初始化都放在构造函数中。如果没有初始化m_iscore+=_score;
的运算结果不一定。
类外定义
类内定义的函数,编译器会优先编译成内联函数(不用特意写),对于复杂无法编译成内联函数的,会编译成普通函数。
类外定义分为同文件类外定义与分文件类外定义
同文件类外定义时,采用void Car::run(){}
的格式进行类外定义
例如前面的程序在定义类的函数时直接罗列出来
class Student
{
public:
void setName(string _name);
string getName();
void setGender(string _gender);
string getGenter();
int getScore();
void initScore();
void study(int _score);
private:
string m_strName;
string m_strGender;
int m_iscore;
};
然后再类的外部定义函数,以void setName(string _name)
为例
void Student::setName(string _name) //类外定义
{
m_strName=_name;
}
之后在int main
函数中调用与前面相同
分文件类外定义的首先要在 ***.h文件中定义类,且类的名称最好与文件名相同。并将该文件作为头文件导入进所需的cpp文件
代码实现的时候直接将前面两段的第一段放进头文件里,第二段及main
函数的内容放进cpp文件中即可。