数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
- class Base {
-
- public:
-
- // 公有成员
-
- protected:
-
- // 受保护成员
-
- private:
-
- // 私有成员
-
- };
公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值,如下所示:
- #include
-
- using namespace std;
-
- class Line
- {
- public:
- double length;
- void setLength( double len );
- double getLength( void );
- };
-
- // 成员函数定义
- double Line::getLength(void)
- {
- return length ;
- }
-
- void Line::setLength( double len )
- {
- length = len;
- }
-
- // 程序的主函数
- int main( )
- {
- Line line;
-
- // 设置长度
- line.setLength(6.0);
- cout << "Length of line : " << line.getLength() <
-
- // 不使用成员函数设置长度
- line.length = 10.0; // OK: 因为 length 是公有的
- cout << "Length of line : " << line.length <
- return 0;
- }
编译结果:
- Length of line : 6
- Length of line : 10
私有(private)成员
私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。
默认情况下,类的所有成员都是私有的。例如在下面的类中,width 是一个私有成员,这意味着,如果您没有使用任何访问修饰符,类的成员将被假定为私有成员:
- class Box
- {
- double width;
- public:
- double length;
- void setWidth( double wid );
- double getWidth( void );
- };
实际操作中,我们一般会在私有区域定义数据,在公有区域定义相关的函数,以便在类的外部也可以调用这些函数,如下所示:
- #include
-
- 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; // OK: 因为 length 是公有的
- cout << "Length of box : " << box.length <
-
- // 不使用成员函数设置宽度
- // box.width = 10.0; // Error: 因为 width 是私有的
- box.setWidth(10.0); // 使用成员函数设置宽度
- cout << "Width of box : " << box.getWidth() <
-
- return 0;
- }
编译结果:
- Length of box : 10
- Width of box : 10
protected(受保护)成员
protected(受保护)成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是可访问的。
在下一个章节中,您将学习到派生类和继承的知识。现在您可以看到下面的实例中,我们从父类 Box 派生了一个子类 smallBox。
下面的实例与前面的实例类似,在这里 width 成员可被派生类 smallBox 的任何成员函数访问。
- #include
- 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(5.0);
- cout << "Width of box : "<< box.getSmallWidth() << endl;
-
- return 0;
- }
编译结果:
Width of box : 5
-
相关阅读:
【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(2)
python 动态导入模块,实现模块热更新
EtherCAT与RTEX驱动器轴回零的配置与实现
Spring Data JPA - Web 支持、排序和分页
C# 并发编程
PowerBI 2022年10月更新
计算机丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享
MFC使用system有弹黑窗的解决 用WinExec(szBuffer, SW_HIDE);代替
(六)Mybatis中接口代理机制及使用
使用MySQL,请善用 JSON 这张牌
-
原文地址:https://blog.csdn.net/m0_74712453/article/details/133077545