C++类定义中的关键字public 、protected 、private的详细介绍【定义类成员的访问权限属性和基类的成员的访问权限属性】

目录

  • 01-定义类成员的访问权限属性:public 、protected 、private
    • 1. **`public` 成员**
    • 2. **`protected` 成员**
    • 3. **`private` 成员**
    • 总结对比
    • 使用建议
  • 02-定义一个类的基类中各成员的属性

01-定义类成员的访问权限属性:public 、protected 、private

C++类的成员有三种属性,分别是public 、protected 、private ,请分别介绍下。

在C++中,类的成员(包括数据成员和成员函数)可以具有三种访问权限:publicprotectedprivate。这些访问权限决定了类成员在类内部、派生类以及类外部的可见性和可访问性。


1. public 成员

  • 访问权限
    • 在类内部可以访问。
    • 在派生类中可以访问。
    • 在类外部(通过对象)可以访问。
  • 用途
    • 用于定义类的接口,即类对外提供的功能。
    • 通常将成员函数(尤其是类的构造函数和公共方法)声明为 public,以便外部代码可以调用。
  • 示例
    class MyClass {
    public:int publicVar;  // 公有成员变量void publicFunc() {  // 公有成员函数std::cout << "Public Function\n";}
    };int main() {MyClass obj;obj.publicVar = 10;       // 可以直接访问obj.publicFunc();         // 可以直接调用return 0;
    }
    

2. protected 成员

  • 访问权限
    • 在类内部可以访问。
    • 在派生类中可以访问。
    • 在类外部(通过对象)不能访问
  • 用途
    • 用于定义类的实现细节,这些细节需要被派生类继承和使用,但不希望暴露给外部代码。
    • 通常将需要被派生类访问的成员变量或成员函数声明为 protected
  • 示例
    class Base {
    protected:int protectedVar;  // 受保护成员变量
    };class Derived : public Base {
    public:void accessProtected() {protectedVar = 20;  // 可以在派生类中访问}
    };int main() {Derived obj;// obj.protectedVar = 30;  // 错误:不能在类外部访问 protected 成员obj.accessProtected();    // 可以通过公有方法间接访问return 0;
    }
    

3. private 成员

  • 访问权限
    • 在类内部可以访问。
    • 在派生类中不能访问
    • 在类外部(通过对象)不能访问
  • 用途
    • 用于隐藏类的实现细节,确保这些细节不会被外部代码或派生类直接访问或修改。
    • 通常将类的内部状态或辅助函数声明为 private
  • 示例
    class MyClass {
    private:int privateVar;  // 私有成员变量void privateFunc() {  // 私有成员函数std::cout << "Private Function\n";}
    public:void setPrivateVar(int value) {privateVar = value;  // 可以在类内部访问私有成员privateFunc();       // 可以在类内部调用私有函数}
    };int main() {MyClass obj;// obj.privateVar = 10;  // 错误:不能在类外部访问 private 成员// obj.privateFunc();    // 错误:不能在类外部调用 private 函数obj.setPrivateVar(10);   // 可以通过公有方法间接访问return 0;
    }
    

总结对比

访问权限类内部派生类类外部
public✔️✔️✔️
protected✔️✔️
private✔️

使用建议

  1. public:用于定义类的接口,供外部代码使用。
  2. protected:用于定义类的实现细节,供派生类使用。
  3. private:用于隐藏类的内部实现,确保封装性。

通过合理使用这三种访问权限,可以实现良好的封装性和代码的可维护性。

02-定义一个类的基类中各成员的属性

在C++中,public Base中的public关键字表示继承方式,具体来说,它决定了基类(Base)中的成员在派生类(Derived)中的访问权限。

继承方式有三种:

  1. public 继承

    • 基类的 public 成员在派生类中仍然是 public
    • 基类的 protected 成员在派生类中仍然是 protected
    • 基类的 private 成员在派生类中不可访问。
    • 这是最常用的继承方式,表示派生类“是一个”基类(is-a 关系)。
  2. protected 继承

    • 基类的 publicprotected 成员在派生类中都变为 protected
    • 基类的 private 成员在派生类中不可访问。
    • 这种继承方式较少使用,通常用于限制派生类的外部访问。
  3. private 继承

    • 基类的 publicprotected 成员在派生类中都变为 private
    • 基类的 private 成员在派生类中不可访问。
    • 这种继承方式表示派生类“根据基类实现”(implemented-in-terms-of 关系),而不是“是一个”基类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12073.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW如何有效地进行数据采集?

数据采集&#xff08;DAQ&#xff09;是许多工程项目中的核心环节&#xff0c;无论是测试、监控还是控制系统&#xff0c;准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境&#xff0c;提供了丰富的功能来实现数据采集&#xff0c;确保数据的实时性与可靠性…

进阶数据结构——双向循环链表

目录 前言一、定义与结构二、特点与优势三、基本操作四、应用场景五、实现复杂度六、动态图解七、代码模版&#xff08;c&#xff09;八、经典例题九、总结结语 前言 这一期我们学习双向循环链表。双向循环链表不同于单链表&#xff0c;双向循环链表是一种特殊的数据结构&…

S4 HANA明确税金汇差科目(OBYY)

本文主要介绍在S4 HANA OP中明确税金汇差科目(OBYY)相关设置。具体请参照如下内容&#xff1a; 1. 明确税金汇差科目(OBYY) 以上配置点定义了在外币挂账时&#xff0c;当凭证抬头汇率和税金行项目汇率不一致时&#xff0c;造成的差异金额进入哪个科目。此类情况只发生在FB60/F…

在线知识库的构建策略提升组织信息管理效率与决策能力

内容概要 在线知识库作为现代企业信息管理的重要组成部分&#xff0c;具有显著的定义与重要性。它不仅为组织提供了一个集中存储与管理知识的平台&#xff0c;还能够有效提升信息检索的效率&#xff0c;促进知识的创新和利用。通过这样的知识库&#xff0c;企业可以更好地应对…

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…

响应式编程与协程

响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程&#xff0c;它更多的使用少量线程实现线程间解耦和异步的作用&#xff0c;如线程的Reactor模型&#xff0c;主要…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例

目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中&#xff0c;date() 函数是一个非常常用的处理日期和时间的函数&#xff0c;所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…

如何在电脑上部署deepseek

由于免费的网页版经常显示服务器异常&#xff0c;并且每次打开网页麻烦&#xff0c;我们可以采用电脑部署的方法&#xff0c;V3和V2现在都很便宜&#xff0c;试了一下问了一下午问题也才0.1&#xff0c;而且现在注册就送14元&#xff0c;心动不如行动&#xff0c;快来薅羊毛&am…

SmartPipe完成新一轮核心算法升级

1. 增加对低质量轴段的修正 由于三维图纸导出造成某些轴段精度较差&#xff0c;部分管路段的轴线段不满足G1连续&#xff0c;SmartPipe采用算法对这种情况进行了修正&#xff0c;保证轴段在一定精度范围内光滑连续。 2. 优化对中文路径的处理 SmartPipeBatch批处理版本优化…

2.3学习总结

今天做了下上次测试没做出来的题目&#xff0c;作业中做了一题&#xff0c;看了下二叉树&#xff08;一脸懵B&#xff09; P2240&#xff1a;部分背包问题 先求每堆金币的性价比&#xff08;价值除以重量&#xff09;&#xff0c;将这些金币由性价比从高到低排序。 对于排好…

四川正熠法律咨询有限公司正规吗可信吗?

在纷繁复杂的法律环境中&#xff0c;寻找一家值得信赖的法律服务机构是每一个企业和个人不可或缺的需求。四川正熠法律咨询有限公司&#xff0c;作为西南地区备受瞩目的法律服务提供者&#xff0c;以其专注、专业和高效的法律服务&#xff0c;成为众多客户心中的首选。 正熠法…

【leetcode练习·二叉树拓展】快速排序详解及应用

本文参考labuladong算法笔记[拓展&#xff1a;快速排序详解及应用 | labuladong 的算法笔记] 1、算法思路 首先我们看一下快速排序的代码框架&#xff1a; def sort(nums: List[int], lo: int, hi: int):if lo > hi:return# 对 nums[lo..hi] 进行切分# 使得 nums[lo..p-1]…

FPGA学习篇——开篇之作

今天正式开始学FPGA啦&#xff0c;接下来将会编写FPGA学习篇来记录自己学习FPGA 的过程&#xff01; 今天是大年初六&#xff0c;简单学一下FPGA的相关概念叭叭叭&#xff01; 一&#xff1a;数字系统设计流程 一个数字系统的设计分为前端设计和后端设计。在我看来&#xff0…

DeepSeek R1 简易指南:架构、本地部署和硬件要求

DeepSeek 团队近期发布的DeepSeek-R1技术论文展示了其在增强大语言模型推理能力方面的创新实践。该研究突破性地采用强化学习&#xff08;Reinforcement Learning&#xff09;作为核心训练范式&#xff0c;在不依赖大规模监督微调的前提下显著提升了模型的复杂问题求解能力。 技…

Vue3学习笔记-模板语法和属性绑定-2

一、文本插值 使用{ {val}}放入变量&#xff0c;在JS代码中可以设置变量的值 <template><p>{{msg}}</p> </template> <script> export default {data(){return {msg: 文本插值}} } </script> 文本值可以是字符串&#xff0c;可以是布尔…

Android学习19 -- 手搓App

1 前言 之前工作中&#xff0c;很多时候要搞一个简单的app去验证底层功能&#xff0c;Android studio又过于重型&#xff0c;之前用gradle&#xff0c;被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下&#x…

深度解读 Docker Swarm

一、引言 随着业务规模的不断扩大和应用复杂度的增加,容器集群管理的需求应运而生。如何有效地管理和调度大量的容器,确保应用的高可用性、弹性伸缩和资源的合理分配,成为了亟待解决的问题。Docker Swarm 作为 Docker 官方推出的容器集群管理工具,正是在这样的背景下崭露头…