C++类的信息隐藏机制

类中可以声明变量和函数,为了将类对象的内部实现与外部行为分离开来,C++语言为类提供了封装机制,与之相关的三个关键字分别是:private、protected 和 public,这三个关键字所代表的含义分别为私有、受保护和公用。三个关键字的作用就是限制类中声明的变量和函数在外部的访问权限。

C++ 的这一机制可以使得类对象的使用者只需要关心类是如何使用的,而不需要去关心类内部的实现问题。

访问权限需要分两部分说明:类内和类外。
  • 在类内部,无论成员变量或成员函数被声明为 private、public 或者 protected 属性,均是可以互相访问的,无访问权限限制;
  • 在类外,通过对象无法访问 private 和 protected 属性的成员变量和成员函数,而仅可以访问 public 属性的成员变量和成员函数。

【例 1】定义一个 book 类来说明访问权限:
#include<iostream>
using namespace std;

class book
{
public:
    void setprice(double a);
    double getprice();
private:
    double price;
};

void book::setprice(double a)
{
    price = a;
}

double book::getprice()
{
    return price;
}

int main()
{
    book Alice;
    Alice.setprice(29.9);
    cout<<"The price of Alice is $"<<Alice.getprice()<<endl;   
    return 0;
}
在例 1 中,声明了一个 book 类,该类中有一个成员变量 price,表示书本的价格属性,另外有两个成员函数,分别是用于设置价格的 setprice() 函数和获取书本价格的 getprice() 函数。

类中成员变量 price 被设置成了 private 属性,而两个成员函数则设置成了 public 属性。声明为 private 属性的成员变量或函数,在类外是不可访问的,而声明为 public 属性的成员变量或函数,在类外可以访问。

另外还有一个关键字 protected,声明为 protected 属性的成员变量或成员函数,在类外也是不可以访问的,但是其派生类内部确实可以访问的,这在后面将会重新介绍,在此处,我们只需要知道 protected 在类外无法访问即可。

回到例 1,在主函数中,声明 book 的对象 Alice,调用 book 类中的 setprice() 函数为 Alice 这本书设置价格,其价格被设置为 29.9 元。之后再调用 book 类中的 getprice() 函数,将其价格打印出来。

在例 1 中,我们不能直接访问 price 这个成员变量,因为其属性被设置为 private 了,但是类中提供了两个 public 属性的成员函数可以供我们操作 price 这个变量。

除了像例 1 那样声明 book 类以外,按照例 2 及例 3 那样声明变量也都是可以的,类内部成员变量及函数声明变量顺序可以是任意的。

【例 2】成员变量和成员函数无声明顺序要求:
class book
{
private:
    double price;
public:
    void setprice(double a);
    double getprice();
};

【例 3】访问权限相同的成员也可以分开声明:
class book
{
public:
    double getprice();
private:
    double price;
public:
    void setprice(double a);
};