C++可见性

118 阅读6分钟

上一篇:C++接口(纯虚函数)

下一篇:C++数组

1. 概述

本篇来讨论C++的可见性。可见性是一个属于面向对象编程的概念,它指的是类的某些成员或方法实际上有很多可见性。我们说的可见性是指,谁可以看到他们,谁能调用它们,谁能使用它们。可见性是对程序的实际运行方式完全没有影响的东西,对程序性能或类似的东西页没有影响,它纯粹是语言中存在的东西,让我们能够写出更好代码或者帮助我们组织代码。

C++中有三个基础的可见性修饰符,privateprotectedpublic。在其他语言中,如java和C#,还有其他的关键字。比如java,我们可以不使用可见性修饰符,那就是所谓的default可见性修饰符。在C#中,有个可见性修饰符叫做"internal"。在C++中,我们只有这三个privateprotectedpublic

2. 案例

1. 准备项目

准备一个简单的项目,项目中有一个Main.cpp文件,文件内容如下。

image.png

2. 开始项目

我们创建一个Entity类,并定义两个变量X和Y

image.png

因为Entity是一个类,默认的可见性实际上是私有的(private),也就是说int X, Y;这段代码和加上private:是一样的

image.png

如果我们写的是struct,那么它的默认可见性是公开的(public),所以这里没有写可见性,并不意味这它没有可见性,它其实是有的(public),只是隐式的给了一个public可见性。

image.png

所以struct的不加可见性修饰,默认等同于加了public:

image.png

好了,我们修改回类,把变量设为私有private

image.png

什么是privateprivate意味着,只有(only*)这个Entity类可以访问这些变量,对这些变量进行读写。这里的只有(only*)要给个星号*,因为C++中有个叫friend的东西,friend是C++关键字,可以让类或者函数成为类Entity的朋友(友元),friend的意思是友元,实际上友元可以Entity类中访问的私有成员。这个后续进行深入。

我们给这个类一个构造函数,并将X的值赋值为0或者其他操作。

image.png

如果我们要在main函数中实例化这个Entity。在Entity这个类的作用域之外,我们不能调用X=2或类似的东西。

image.png

下面说说publicpublic意味着所有人都可以访问它

image.png

我们可以在Entity类中访问它,也可在main函数中访问它。甚至创建一个Player类继承Entity类,在Player类中也可以访问它。

image.png

好,这就是关于可见性的简短回答。

现在,我们来谈谈为什么要使用可见性,哪里要用到?为什么不是所有的都设置为public呢?

首先,public公开一切是一种糟糕的想法,对于开发者和写代码而言,这是风格问题,这是一个如何写好代码的问题。可见性是让代码更加容易维护,容易理解,不管是阅读代码还是扩展代码。这与性能无关,也不会产生完全不同的代码,可见性不是CPU需要理解的东西,这只是人类发明来帮助自己和他人的东西。说到帮助他人,如果我们将某件事标记为private,这基本上告诉每个人包括我们自己,我们不应该从其他类中访问这个,不能从其他的代码访问,我们只能在该类的内部访问这个。这意味着,如果我们从来没有使用过一个类,我们看包含什么,我应该可以这么说,我只被允许接触public的东西,这就是我应该使用这个类的方式,这是这个类的正确用法,实际上是调用公共函数。如果我使用一个类,这是API的一部分,我看看它,看到了一个我想调用的私有函数,我知道我不应该调用私有函数,这个类的作者,可能提供了一些其他方法,来实现了同样的事情,因为如果是我,如果我能调用私有函数,也许这不会给我带来我期待的结果,或者这可能会破坏其他的东西。代码是个错综复杂的东西,通过明确可见性,我们可以确保人们不会调用它们不应该调用的代码,并可能破坏某些东西。

一个很好的例子是UI界面,如果我们想移动按钮的位置,如果我只想访问按钮的坐标X和Y,然后改变变量,按钮可能实际上不会移动,我的意思是,X轴和Y轴的位置(改变方式)可能不同,为了让按钮真正的移动,我们可能需要刷新显示,如果我只设置了X = 5之类的,是的,X变量改变了,但是显示器实际上并不知道,它不知道要从内存获取新的值,而是继续用老的值。然而,如果我在类中创建一个方法叫做SetPosition或者SetX,我可以做的不仅仅是用给X赋值,我还可以调用另一个叫Refresh之类的方法,它能做所有它需要做的事情,我可以让那个X变量本身私有(private),然后那个SetPosition或SetX函数为公有(public),显然,想要使用这些代码的人,可以看到,我不应该直接给X赋值,我应该调用SetPositiono或SetX来设置X的值。

这个小例子说明了,为什么我们想要使用可见性来帮助其他开发者和帮助我们自己。我们通常写代码的时候,会发现,我们会很快忘记我们写了些什么东西,而且不要认为,反正我从来不在团队中工作,我不需要去处理可见性,或者只是把所有的东西都搞成public的,不要这样搞。因为如果几个月之后或者几周后甚至几天后,我们再看我们的代码,我们可能会忘记它是如何工作的。但通过使用像可见性这样简单的东西,基于可见性,我们可能会看到,我们想要访问和利用类的方式。

上一篇:C++接口(纯虚函数)

下一篇:C++数组