数据隐藏是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记public、private、protected 来指定的。关键字 public、private、protected 称为访问说明符。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
class Base { public: // public members go here protected: // protected members go here private: // private members go here };
公有成员在程序中类的外部是可访问的。可以不使用任何成员函数来设置和获取公有变量的值,如下所示:
#include<iostream> using namespace std; class xc { public: double length; double width; void set(double len); double get(void); }; void xc::set(double len) { length=len; } double xc::get(void) { return length; } int main() { xc sw; sw.length=(20.5); cout<<"length="<<sw.length<<endl; sw.length=10.5; cout<<"length="<<sw.length<<endl; return 0; }
私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。
默认情况下,类的所有成员都是私有的。例如在下面的类中,width 是一个私有成员,这意味着,如果没有使用任何访问修饰符,类的成员将被假定为私有成员:
class Box { double width; public: double length; void setWidth( double wid ); double getWidth( void ); };
实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数,如下所示:
#include<iostream> using namespace std; class xc { public: double length; void set(double len); double get(void); private: double width;//不能被外部函数访问 }; void xc::set(double wid) { width=wid; } double xc::get(void) { return width; } int main() { xc sw; sw.length=10.5; cout<<"length="<<sw.length<<endl; //sw.width=10.5;//错误,不能被访问 sw.set(12.5); cout<<"width="<<sw.get()<<endl; return 0; }
保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。
#include<iostream> using namespace std; class xc { protected: double width; }; class sw:xc //派生类 { public: void set(double wid); double get(void); }; //子类的成员函数 void sw::set(double wid) { width=wid; } double sw::get(void) { return width; } int main() { sw tx; tx.set(10.5); cout<<"width="<<tx.get()<<endl; return 0; }