C++ 可见性模式

2025年3月17日 | 阅读 10 分钟

引言

C++ 中面向对象编程的关键组成部分之一是数据隐藏,它使我们能够隐藏对象的内部特征,例如数据成员,并禁止程序函数直接访问对象的内部表示数据成员成员函数

访问修饰符定义了对类成员函数的访问限制。在 C++ 中,可见性模式,如private、publicprotected,也称为访问修饰符。在本文接下来的部分中,我们将详细介绍它们中的每一个。

我们可以通过使用可见性模式来确定派生类将如何继承基类以及派生类可以访问哪些基类成员。由于它们用于指定类成员的可访问性和可见性级别,因此它们被称为可见性模式访问说明符

派生类对象能够利用基类中的成员函数时,访问说明符主要用于继承。当子类从基类派生时,使用访问说明符的标准语法如下:

在上面的代码中,access_specifier告诉我们哪些基类成员将被派生类获取并使其可访问。还有一个称为Base的基类和一个称为Derived的派生类。

C++ 类中允许有多个 public、protectedprivate 部分。下面的代码演示了如何在类中使用可见性模式:

在上面的代码中,通过访问说明符将基本类 base 分隔成几个部分。

注意:如果没有指定可见性模式,则默认考虑private 模式

私有成员

子类以 private 可见性模式继承其父类时,基类的所有成员——public、privateprotected 成员——都将成为派生类中的私有成员。

除了派生类本身之外,只有派生类或友元函数的成员函数才能访问这些成员。

当派生类访问模式设置为private时,下面的框图可以说明基类数据成员的继承方式:

Visibility Modes in C++

如上图所示,私有变量仅在基类本身的成员函数中可用,因为它是基类中的私有类型。因此,它在派生类中不可访问。基类的 protected 变量 b 和 public 变量 c 将在派生类中变为 private,并且只有其成员函数可以访问它们。

一个非常简单的现实生活示例将帮助我们理解何时需要每个访问说明符。假设您想在社交网络应用程序上更新您的状态,但您有一些标准和限制,规定谁可以在线查看此状态。因此,如果您希望此状态对其他人隐藏或“仅对我有可见”,您就是在遵守 private访问说明符的概念。

示例

让我们看一个案例研究,以更好地理解 private 可见模式的概念及其施加的限制:

在上面的代码中,由于可见性模式private基类中的所有成员派生类中都已设为 private。当派生类对象在派生类外部尝试访问这些成员时,会**引发**一个错误。

让我们再运行一个 C++ 程序,展示当基类对象尝试在类外部访问 private数据成员 x时 private 访问说明符的功能。

输出

156

解释

由于我们不允许直接从类外部访问私有数据成员,因此上述程序的输出将是**编译时错误**。

但是,通过使用**基类的 public 成员**函数,我们可以间接访问私有数据成员。

可访问性

Private 模式的可访问性可以总结如下:

可访问性Private 模式
同一类是的
派生类不能
其他类不能
程序中的任何位置不能

private 访问说明符指定的成员仅在同一类内部可访问;它们在任何派生类或程序中的其他类中均不可访问。

公共成员

当我们在public 可见性模式下将子类从父类继承时,基类的public、privateprotected 成员将保留为派生类的public、privateprotected 成员。在public 可见性模式下,父类的所有成员都保持可访问。

子类和所有其他类都可以访问**父类的 public 成员**。只有**派生类**及其**继承的类**可以访问 protected 基类成员。虽然,**子类**无法访问**私有成员**。

派生类访问模式设置为public时,下面的框图可以说明基类数据成员的继承方式:

Visibility Modes in C++

如上图所示,**私有变量**是**私有类型**,因此仅由**基类成员**函数访问。因此,它在**派生类**中不可用。**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 模式的可访问性可以总结如下:

可访问性Private 模式
同一类是的
派生类是的
其他类是的
程序中的任何位置是的

用户可以访问在 public访问说明符下定义的成员,无论是在同一类、派生类、任何其他类,甚至类外部。

Protected 成员

当**子类**以 protected可见性模式从其**父类**派生时,基类的所有成员都将成为派生类的 protected 成员。因此,现在只有**派生类**及其成员函数可以访问这些成员。这个派生类的**继承子类**将可以访问这些成员,这些成员同样是可继承的。

派生类访问模式设置为protected时,下面的框图可以说明基类数据成员的继承方式:

Visibility Modes in C++

如上图所示,**私有变量**是**私有类型**,因此仅由**基类成员**函数访问。因此,它在**派生类**中不可用。**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 模式的可访问性可以总结如下:

可访问性Private 模式
同一类是的
派生类是的
派生类的继承子类是的
其他类不能
程序中的任何位置不能

派生类及其**继承的类**可以访问在 protected 访问说明符下定义的成员。

C++ 中 private、public 和 protected 之间的区别

私有公共Protected
只有基类中的函数可以访问被指定为 private 的类成员。被设为 public 的类参与者可以从任何地方访问。基类及其派生类允许访问被指定为 protected 的类成员。
关键字private用于声明 private 成员,后跟冒号(:)关键字 **public** 用于声明成员,后跟冒号(:)符号。Protected成员通过使用单词 protected 和冒号(:)字符来识别。
Private 成员不会在类之间传递。在类中,public 成员可以被继承。在类中,protected 成员可以被继承。
它为其数据成员提供了最高级别的保护。它不对其保存的数据提供任何安全保障。与 private 访问说明符相比,它提供的安全性较低。
可以使用**友元函数**访问 private 成员。可以借助或不借助友元功能来访问 public 成员。Protected 成员在类外部不可访问,友元函数也无法访问,但该类的任何子类(派生类)都可以访问它们。

上述三种可见性模式在 C++ 中可以总结如下:

结论

  • 类成员(数据成员成员函数)在类外部的可用性已通过访问说明符确定。
  • 访问说明符用于定义派生类对象是否可以使用基类中的成员函数。在继承中,这被称为**可访问性**。
  • 在 C++ 中,有三种不同类型的访问说明符:private、publicprotected。如果未定义或请求可见模式,则默认考虑 private 模式。
  • 如果类的成员被指定为 public,那么任何人都可以访问它们。
  • 类成员被标记为 protected 时,基类和任何派生类都可以访问它们。
  • 当类的成员被指定为private时,只有**基类**的其他成员和**友元函数**可以访问它们。
  • publicprotected 访问说明符相比,private 访问说明符为其数据成员提供了更高的安全性。
  • 尽可能将类属性声明为private被认为是最佳实践,因为它有助于提高数据安全性。
  • 访问修饰符使我们能够控制程序的哪个部分可以访问类的成员,因此它们主要用于**数据隐藏**和**封装**,以避免数据滥用。