欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Cherno C++学习笔记 P30 C++的类的可见性

Cherno C++学习笔记 P30 C++的类的可见性

2025/2/12 10:51:32 来源:https://blog.csdn.net/weixin_41931423/article/details/144309860  浏览:    关键词:Cherno C++学习笔记 P30 C++的类的可见性

这一篇文章我们讲一下有关于C++中类的可见性问题。

可见性是面对对象编程的概念,主要是有关于函数能不能访问到变量。但是需要注意的一点是,可见性是纯粹的语言当中的东西,实际上它对于内存,程序运行速度等等是没有任何影响的,它单纯的是为了我们的代码可读性更强,能够帮助我们写出更好的代码以及组织代码。

我们在C++当中提供了三个基础的可见性修饰符,分别是public,privateprotected。其中private是类当中的默认可见性,如果我们什么都不写,那么这些变量/方法就是private的。

#include<iostream>
#include<string>class Entity {float X, Y;
public:Entity() {X = 0.0f;Y = 0.0f;}
};int main() {Entity e;std::cout << e.X << std::endl;std::cin.get();
}

如上所示,如果我们这么写,那么编译器就会给我们提前警告,我们在main当中是无法访问到e的X和Y变量的,能访问这些变量的只能是类当中的方法,即使是这个类的子类,也不能访问这个类的private变量。

但是,我们还是有机会可以从外部访问类当中的private变量的,那就是声明一个函数是这个类的友元函数friend,只要有一个外部函数是这个类的好基友,那么我们就可以通过这个函数访问类的private变量。正所谓是宁予基友,不予孩子。

protected是介于private和public之间的一个状态,在子类当中我们可以访问protected变量,但是在main当中是不可以的,我们举一个例子。

#include<iostream>
#include<string>class Entity {
protected:float X, Y;
public:Entity() {X = 0.0f;Y = 0.0f;}
};class Player : public Entity {
public:const char* m_Name;
public:Player() {X = 0.0f;Y = 0.0f;m_Name = "Cherno";}
};int main() {Entity e;std::cout << e.X << std::endl;std::cin.get();
}

可以看到,在Player类当中是无压力访问X和Y的,但是在main当中依然是访问不了。当我们使用public继承的时候,父类当中的public变量过来了依然是public变量,protected变量也依然是protected变量,也就是说,public继承,并不会改变这些变量的可见性。

如果是protected继承,那父类中的public&protected变量在子类中都会变成protected;如果是private继承,那么父类中的public&protected变量都会在子类中变成private。但是一般而言,我们只有public继承,另外两种继承方式很少见到,所以也就不多讲了。

public变量就很简单了,所有的地方都可以访问public变量。

那么就有一个问题,我们为什么要有类的可见性这样一个设定?这个是为了提高我们代码的可读性。实际上对于CPU来说,它是不知道哪个变量是public哪个变量是private的,定义这个东西不会影响到我们程序运行的性能。但是如果因为这个原因,就把所有的变量/方法都定义为public,是一个很不好的代码风格和习惯。通过将一些变量/方法封装到private当中,是在提示大家不要通过这些变量/方法来使用这个类,而暴露在public里面的方法才是我们可以使用的。这也是提示了我们如何使用这个类,同样是提示自己。因为实际上可能几周甚至几天之后,我们就会忘了自己写的代码是干什么用的了= =所以对代码进行这样的整理就显得非常关键。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com