Contents
数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
class Base
{
public:
// 公有成员
protected:
// 受保护成员
private:
// 私有成员
};
公有成员在程序中类的外部是可访问的,可以不使用任何成员函数来设置和获取公有变量的值,实例代码如下所示:
#include <iostream>
using namespace std;
class Line
{
public:
double length;
void setlength(double len);
double getlength(void);
// 公有成员
protected:
// 受保护成员
private:
// 私有成员
};
// class Box
// {
// double width;
// public:
// double length;
// void setWidth( double wid );
// double getWidth( void );
// };
// 成员函数定义
void Line::setlength(double len)
{
length = len;
}
double Line::getlength(void)
{
return length;
}
// 程序的主函数
int main(int argc, char const *argv[])
{
Line line;
// 设置长度
line.setlength(6.9);
cout << "Length of line: " << line.getlength() << endl;
// 不适用成员函数设置长度
line.length = 10.0; // length是公有成员变量
cout << "Length of ling: " <<line.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 Box
{
public:
double length;
void setWidth(double wid);
double getWidth(void);
private:
double width;
};
// 成员函数定义
double Box::getWidth(void)
{
return width;
}
void Box::setWidth(double wid)
{
width = wid;
}
int main()
{
Box box;
// 不使用成员函数设置长度
box.length = 10.0; // length是公有成员变量
cout << "Length of box: " << box.length << endl;
// 不适用成员函数设置宽度
// box.width = 23.9;
box.setWidth(23.9); // 使用类成员函数设置宽度
cout << "Width of box: " << box.getWidth() << endl;
return 0;
}
编译运行以上实例代码,输出结果如下图所示:
保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。下面的实例是演示私有成员变量width可被派生类smallBox的成员函数访问。代码如下:
#include "iostream"
using namespace std;
class Box
{
protected:
double width;
};
class SmallBox:Box // SmallBox 是派生类
{
public:
void setSmallWidth( double wid );
double getSmallWidth( void );
};
// 子类的成员函数
double SmallBox::getSmallWidth(void)
{
return width ;
}
void SmallBox::setSmallWidth( double wid )
{
width = wid;
}
// 程序的主函数
int main( )
{
SmallBox box;
// 使用派生类成员函数设置保护成员变量宽度
box.setSmallWidth(7.8);
cout << "Width of box : "<< box.getSmallWidth() << endl;
return 0;
}
以上实例代码被编译执行后,输出结果如下图所示:
有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
但无论哪种继承方式,上面两点都没有改变:
三种继承方式总结如下:
继承方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 | 继承引起的访问控制关系变化概括 |
---|---|---|---|---|
public继承 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类的非私有长远在子类的访问属性不变 |
protected继承 | 变为protected成员 | 变为protected成员 | 不可见 | 基类的非私有成员都为子类的保护成员 |
private继承 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成员都称为子类的私有成员 |