C++ 可见性模式2025年3月17日 | 阅读 10 分钟 引言C++ 中面向对象编程的关键组成部分之一是数据隐藏,它使我们能够隐藏对象的内部特征,例如数据成员,并禁止程序函数直接访问对象的内部表示、数据成员和成员函数。 访问修饰符定义了对类成员函数的访问限制。在 C++ 中,可见性模式,如private、public和protected,也称为访问修饰符。在本文接下来的部分中,我们将详细介绍它们中的每一个。 我们可以通过使用可见性模式来确定派生类将如何继承基类以及派生类可以访问哪些基类成员。由于它们用于指定类成员的可访问性和可见性级别,因此它们被称为可见性模式或访问说明符。 当派生类对象能够利用基类中的成员函数时,访问说明符主要用于继承。当子类从基类派生时,使用访问说明符的标准语法如下: 在上面的代码中,access_specifier告诉我们哪些基类成员将被派生类获取并使其可访问。还有一个称为Base的基类和一个称为Derived的派生类。 C++ 类中允许有多个 public、protected或private 部分。下面的代码演示了如何在类中使用可见性模式: 在上面的代码中,通过访问说明符将基本类 base 分隔成几个部分。 注意:如果没有指定可见性模式,则默认考虑private 模式。私有成员当子类以 private 可见性模式继承其父类时,基类的所有成员——public、private和protected 成员——都将成为派生类中的私有成员。 除了派生类本身之外,只有派生类或友元函数的成员函数才能访问这些成员。 当派生类访问模式设置为private时,下面的框图可以说明基类数据成员的继承方式: ![]() 如上图所示,私有变量仅在基类本身的成员函数中可用,因为它是基类中的私有类型。因此,它在派生类中不可访问。基类的 protected 变量 b 和 public 变量 c 将在派生类中变为 private,并且只有其成员函数可以访问它们。 一个非常简单的现实生活示例将帮助我们理解何时需要每个访问说明符。假设您想在社交网络应用程序上更新您的状态,但您有一些标准和限制,规定谁可以在线查看此状态。因此,如果您希望此状态对其他人隐藏或“仅对我有可见”,您就是在遵守 private访问说明符的概念。 示例让我们看一个案例研究,以更好地理解 private 可见模式的概念及其施加的限制: 在上面的代码中,由于可见性模式是private,基类中的所有成员在派生类中都已设为 private。当派生类对象在派生类外部尝试访问这些成员时,会**引发**一个错误。 让我们再运行一个 C++ 程序,展示当基类对象尝试在类外部访问 private数据成员 x时 private 访问说明符的功能。 输出 156 解释 由于我们不允许直接从类外部访问类的私有数据成员,因此上述程序的输出将是**编译时错误**。 但是,通过使用**基类的 public 成员**函数,我们可以间接访问私有数据成员。 可访问性Private 模式的可访问性可以总结如下:
由private 访问说明符指定的成员仅在同一类内部可访问;它们在任何派生类或程序中的其他类中均不可访问。 公共成员 当我们在public 可见性模式下将子类从父类继承时,基类的public、private和protected 成员将保留为派生类的public、private和protected 成员。在public 可见性模式下,父类的所有成员都保持可访问。 子类和所有其他类都可以访问**父类的 public 成员**。只有**派生类**及其**继承的类**可以访问 protected 基类成员。虽然,**子类**无法访问**私有成员**。 当派生类访问模式设置为public时,下面的框图可以说明基类数据成员的继承方式: ![]() 如上图所示,**私有变量**是**私有类型**,因此仅由**基类成员**函数访问。因此,它在**派生类**中不可用。**public 变量**将继续对所有人(包括**子类**)可用。**基类的 protected 变量 b** 将在**派生类**中保持 protected,并且仅在**派生类**及其**继承的类**中可用。 使用上面更新社交媒体应用状态的现实生活示例,如果您希望您的状态对公众可见,您就是在遵循**“Public 访问说明符”**的概念。 示例为了进一步理解 public 暴露模式的概念及其施加的限制,让我们看一个例子: 在上面的代码中,由于可见性模式是 public,**Parent 类**的 **protected 变量 x2** 将被**继承**并在**Child 类**及其**继承的类**中可访问,正如 **public 变量 x3** 将从 **Parent 类**被**继承**并在**Child 类**和其他类中可访问一样,但**private 变量 x1** 将在**Child 类**中不可访问。 让我们再运行一个 C++ 程序,展示当基类对象希望在**main() 函数**中访问 public数据成员 x时 public 访问说明符的功能。 输出 8 16 在上面的程序中,**数据成员 x** 被指定为 **public**,允许从类**内部**和**外部**进行访问。 可访问性Public 模式的可访问性可以总结如下:
用户可以访问在 public访问说明符下定义的成员,无论是在同一类、派生类、任何其他类,甚至类外部。 Protected 成员当**子类**以 protected可见性模式从其**父类**派生时,基类的所有成员都将成为派生类的 protected 成员。因此,现在只有**派生类**及其成员函数可以访问这些成员。这个派生类的**继承子类**将可以访问这些成员,这些成员同样是可继承的。 当派生类访问模式设置为protected时,下面的框图可以说明基类数据成员的继承方式: ![]() 如上图所示,**私有变量**是**私有类型**,因此仅由**基类成员**函数访问。因此,它在**派生类**中不可用。**public 变量 a**(将在派生类中变为 protected)将仅由这个**派生类**的**继承子类**访问。**基类的 protected 变量 b** 将在**派生类**中保持 protected,并且仅在**派生类**及其**继承的类**中可用。 使用我们之前使用的更新社交媒体应用状态的现实生活示例;假设您希望您的状态仅对您的朋友和朋友可见。在这种情况下,您就是在遵循**“Protected 访问说明符”**的概念。 示例让我们看一个案例研究,以更好地理解 protected 可见模式的概念及其施加的限制: 在上面的代码中,由于可见性模式是 protected,**Parent 类**的 **protected** 和 **public 成员**将变为**Child 类**的 protected 成员。 **public 变量 x3** 将从**父类**作为 protected 成员**继承**,并可在**Child 类**中访问,但**private 变量 x1** 将不能。**protected 变量 x2** 和 **public 变量 x3** 都将从**Parent 类****继承**并可在**Child 类**中访问。 让我们再运行一个 C++ 程序,展示当基类对象希望在**main() 函数**中访问 protected数据成员 x时 protected 访问说明符的功能。 输出 8 24 解释 在上面的程序中,**数据成员 x** 被指定为 protected,允许基类的任何**子类(派生类)**访问它。 可访问性Protected 模式的可访问性可以总结如下:
派生类及其**继承的类**可以访问在 protected 访问说明符下定义的成员。 C++ 中 private、public 和 protected 之间的区别
上述三种可见性模式在 C++ 中可以总结如下:结论
下一主题C++ 初始化列表 |
每当在 C++ 语言编写的程序中定义函数时。如果我们想调用该函数,可以通过两种方式实现:按值调用 按引用调用 在讨论按引用调用方法之前,我们将了解两种调用方式……
阅读 4 分钟
在 C++ 中,typeid 运算符是一个内置运算符,允许您在运行时检索对象的类型信息。它是一个强大的工具,可用于测试、调试和编写更有效、更灵活的代码。typeid 运算符接受一个参数...
阅读 10 分钟
正如我们所知,C++ 编程语言有许多内置函数可以帮助我们避免编写长行代码。其中一个函数是 C++ 编程语言的标准模板库 (STL) 中的 multimap find 函数。它将帮助我们...
阅读 3 分钟
在本文中,我们将讨论输入输出重定向及其示例。但在讨论输入输出重定向之前,我们必须了解 C++ 中的重定向。重定向是指更改输入输出流的默认源或目标。它会改变数据流的方式……
阅读 4 分钟
C++ 是一种灵活且强大的编程语言,结合了过程式和面向对象编程范例。C++ 作为 C 编程语言的扩展而创建,增加了类和对象等重要功能,使得编写模块化和可重用代码成为可能。C++ 的优势之一是……
阅读 4 分钟
介绍:宽字符与 char 数据类型相似,但宽字符占用两倍的空间,因此可以容纳更大的值。char 的 256 个可能值对应于 ASCII 表中的条目。相反,宽字符最多可以接受 65536 个值,……
5 分钟阅读
在本文中,我们将讨论 C++ 的应用程序。C++ 编程语言非常灵活,在各个行业都有广泛的用途。一些最流行的 C++ 程序列举如下:系统软件开发:C++ 通常用于创建系统级软件,例如...
阅读 3 分钟
数字及其运算在编程语言中起着至关重要的作用。它们是算法中数学计算和决策制定的构建块。加法、减法、乘法、除法和模运算等运算用于执行算术计算并产生结果。此外,比较运算符(例如……
阅读 3 分钟
C++ 标准库中提供了各种流来处理输入输出活动。其中一个流称为 cerr,它是“标准错误”的缩写。与用于一般用途的 cout 流不同,cerr 专门用于错误消息和诊断……
阅读 3 分钟
引言:开发系统软件、视频游戏和高性能应用程序只是可以使用强大且适应性强的编程语言 C++ 创建的各种应用程序中的一小部分。C++ 作为一种语言,具有广泛的功能,包括相当多的……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India