定义
在C++工程中,往往会有很多类的存在,为了避免类之间的相互影响。应该让类仅仅public一些必须让外界访问的成员,而隐藏private一些不想要公开的成员内容。这种信息的隐藏,就叫做C++类的封装。
封装的目的
封装的目的是为了保护私有成员变量
正好唠叨两句C++与C的区别
C++对C的最根本的改变就是把函数放进了结构之中,也就是我们常说的C++的类。C++的类是个很牛的功能,它可以把变量和函数捆绑在一起,其中变量就叫做成员变量,函数就叫做成员函数。同时C++提供了三个关键字来区分这些成员的访问权限:public、private、protected用于声明哪些变量和函数是可以公开访问的、私有的、受保护的,这也就达到了信息隐藏的目的。即让类仅仅公开必须让外界知道的内容,而隐藏其他一切内容。
public、private、protected的区别
我们总是知道public是公开的,private是私有的,protected是受保护的。但具体更加细节的访问权限我们应该需要知道。
class Person{
public:
int name;//比如说名字是可以公开访问的,外部可以随便访问,就放在public下
protected:
int money;//比如说钱是受保护的,只有自己的类和继承者的类可以使用
private:
char password;//比如说密码是要保密的,只有在自己这个类里才能访问
};
如何实现
class创建类,如果成员变量为public类型,则外部可以随意赋值,无法保证程序的安全性。所以,将成员变量封装起来,外部就不是随便访问了,如果访问的话需要一些条件才能访问。通过提供公共的getter和setter给外界去访问私有的成员变量。
class Person
{
//public:
// int m_age;//外部可以随意访问,所以赋值,赋什么值,m_age就是什么值
private:
int m_age;//将其私有化,外部不可以直接访问,但可以通过setter和getter方法访问,下面要定义
public:
void setterAge(int age)//这就叫封装里的setter方法
{
if (age < 0)return;//对不想要随意乱赋值的变量进行过滤保护,比如:年龄必须大于0之类的
m_age = age;//通过public成员函数访问private成员变量
}
int getterAge()//这就叫封装里的getter方法
{
return m_age;//将setter方法赋的值,用getter方法返回,以供访问使用
}
};
我们要知道类内,public的成员函数是可以访问private的成员变量的,而且是可以对其进行赋值的。但仅限于类内,所以setter和getter方法才可以访问private里的成员变量
int main()
{
Person person;
//person.m_age = -4;//举个例子,外部随便赋值age为-4,其实年龄不能是负数,所以这样的变量就不安全,我们要把它封装起来
person.setterAge(4);
int age = person.getterAge();
cout << age << endl;//4
getchar();
return 0;
}
然后,我们在类外(例如main函数)就可以通过setter方法访问并赋值类内的私有变量,同时采用getter方法返回被访问的私有变量。这一过程其实就是间接的访问私有成员,这就叫做类的封装。
自己对private成员用途的一些理解
- 可以让外部访问,但是不能随便赋值。比如年龄不能是负数这种。有这样的需求,只需在类中的public下创建setter和getter方法
- 不想让外部访问,仅仅供类内的一些函数使用。这时候就不需要setter和getter方法了。因为我只想要供类内的函数使用,所以外部不可以随意更改这个值,因为一旦随意更改,类内的函数可能就不是我想要的结果了,所以要把这种成员设置为private