C++学习——访问限定符

在C++中,protected, friend, 和 public 是访问限定符,用于指定类成员的访问级别。

访问限定符

public

public 成员可以从类的任何地方访问,包括类的外部。这通常是你希望外部代码能够直接访问和操作的那些方法和属性。比如,一个类的大多数接口(APIs)都会被声明为 public

class Base {
private:int privateVar; // 只有Base的成员函数可以访问
};class Derived : public Base {void func() {// cout << privateVar; // 错误:无法访问Base的private成员}
};

protected

protected 成员在类的内部和派生类(子类)中是可见的,但不能从类的外部直接访问。这对于在继承中隐藏实现细节但仍允许子类访问这些细节很有用。

class MyClass {
protected:int protectedData; // 只有MyClass的实例和它的子类可以访问
};

private

private 成员只能被类的其他成员(方法或属性)访问,不能从类的外部访问。这是封装的核心概念,意味着类可以隐藏它的内部状态和实现细节。

class MyClass {
private:int privateData; // 只有MyClass的方法可以访问
};

friend

friend 关键字允许一个特定的类或函数访问另一个类的 privateprotected 成员。它通常用于允许两个或更多的类共享实现细节,同时对其他类隐藏这些细节。

class MyClass {friend class FriendClass; // FriendClass可以访问MyClass的所有成员private:int privateData; // 私有数据
};

private 和 protect 的区别

privateprotected 是类成员的两种访问控制级别,在C++中用来实现封装和继承控制。它们之间的主要区别在于从派生类(子类)访问这些成员时的权限。但是friend类既可以访问private,又可以访问protect

private

当成员被声明为 private 时,它们只能被包含它们的类的函数访问。这意味着即使是继承自该类的子类也无法访问 private 成员。private 是类成员的默认访问级别,如果没有指定访问控制关键字,则成员将被认为是私有的。

class Base {
private:int privateVar; // 只有Base的成员函数可以访问
};class Derived : public Base {void func() {// cout << privateVar; // 错误:无法访问Base的private成员}
};

protected

protected 成员类似于 private 成员,但它们提供了一个额外的权限:被声明为 protected 的成员不仅可以被包含它们的类访问,还可以被派生类访问。然而,即使是 protected 成员,也不能从包含它们的类的对象外部访问。

class Base {
protected:int protectedVar; // Base的成员和派生自Base的类可以访问
};class Derived : public Base {void func() {cout << protectedVar; // 正确:可以访问Base的protected成员}
};

示例

#include <iostream>
using namespace std;// 基类
class Base {
private:int privateVar; // 基类的私有成员,只能被基类访问protected:int protectedVar; // 基类的受保护成员,可以被派生类访问public:Base() : privateVar(0), protectedVar(0) {} // 构造函数初始化成员变量void setPrivateVar(int val) { privateVar = val; } // 设置私有变量的公共函数void setProtectedVar(int val) { protectedVar = val; } // 设置受保护变量的公共函数int getPrivateVar() const { return privateVar; } // 获取私有变量的公共函数
};// 派生类
class Derived : public Base {
public:void setDerivedProtectedVar(int val) {// 设置从基类继承的受保护成员变量protectedVar = val;}int getDerivedProtectedVar() const {// 获取从基类继承的受保护成员变量return protectedVar;}void tryAccessPrivateVar() {// cout << privateVar; // 错误:派生类无法访问基类的私有成员}
};int main() {Base b;Derived d;// b.privateVar = 1; // 错误:无法直接访问私有成员b.setPrivateVar(1); // 正确:通过公共接口设置私有成员cout << b.getPrivateVar() << endl; // 正确:通过公共接口获取私有成员的值// d.protectedVar = 2; // 错误:无法直接访问受保护成员d.setDerivedProtectedVar(2); // 正确:通过派生类的公共接口设置受保护成员cout << d.getDerivedProtectedVar() << endl; // 正确:通过派生类的公共接口获取受保护成员的值return 0;
}

在这段代码中,Base 类有两个成员变量:privateVarprotectedVarprivateVar 为私有成员,只能通过 Base 类的成员函数进行访问和修改。protectedVar 为受保护成员,它可以被派生类 Derived 直接访问和修改。

Derived 类继承了 Base 类,并尝试通过其成员函数 setDerivedProtectedVar 来修改 protectedVar。这是允许的,因为 protectedVarBase 类中是受保护的。然而,Derived 类无法访问 Base 类的 privateVar,即使通过成员函数 tryAccessPrivateVar 尝试也不行。

main 函数中,我们创建了 BaseDerived 的对象,并展示了如何通过公共接口来设置和获取私有和受保护的成员变量。直接访问这些变量的尝试将会导致编译错误。

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

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

相关文章

OpenHarmony开发环境快速搭建(无需命令行)

一. 搭建Windows环境 在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、H…

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜&#xff08;https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard&#xff09;前列。多个基准测试表明&#xff0c;就性能而言&#xff0c;它正在接近GPT-3.5…

助老理发,寒冬送暖从头开始

为进一步弘扬尊老、敬老、爱老、助老的中华民族传统美德&#xff0c;解决老年人年龄大、冬季出行不便的问题&#xff0c;2023年12月20日&#xff0c;绿萝志愿服务队在翠堤社区开展了“助老理发”志愿活动。 大雪过后天气格外寒冷&#xff0c;但志愿者们依旧早早的来现场做…

【Flink-Bug】Flink 自定义 Sink 重写 RichSinkFunction 方法时重复调用 open 的解决方案

【Flink-Bug】Flink 自定义 Sink 重写 RichSinkFunction 方法时重复调用 open 的解决方案 Flink 自定义 RichinkFunction 时可能会重写 open 方法进行某些连接的初始化操作&#xff0c;但是会出现重复调用 open 方法的问题&#xff0c;如&#xff1a;MQ&#xff0c;如果重复调用…

【Unity实现海浪盒_GerstnerWaves算法_焦散Caustics效果_案例分享】

Unity实现海浪盒效果 背景设置好顶点色参数海浪盒水体部分效果为了快速实现效果,下面用Shadergraph实现效果。ShaderGraph水体全节点ShaderGraph全节点模块序号ShaderGraph属性ShaderGraph Graph Setting1. GerstnerWave 顶点动画部分,输出的是顶点偏移和NormalOSWaves算法Ge…

扭蛋机小程序搭建,“互联网+”下的发展优势

随着我国生活水平和消费能力不断提高&#xff0c;人们对各种潮流文化类的产品需求也快速上升。至此&#xff0c;我国潮流文化市场得到了快速发展&#xff01; 扭蛋机作为潮玩中的一种商业模式&#xff0c;深受不同年龄层用户的喜爱。并且扭蛋机的种类也是各式各样&#xff0c;…

MYSQL单表删除重复的数据方法

先简述遇到的问题&#xff1a;我要删除一张表的数据&#xff0c;先是查询到所有的重复的数据id直接进行删除操作&#xff0c;但是一直执行不完&#xff08;一直执行就是删除不完&#xff09; DELETE FROM table WHERE id IN ( SELECT MAX(id) id from table where rId…

P2089 烤鸡

烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡&#xff08;本是同畜牲&#xff0c;相煎何太急&#xff01;&#xff09;Hanke 吃鸡很特别&#xff0c;为什么特别呢&#xff1f;因为他有 10 10 10 种配料&#xff08;芥末、孜然等&#xff…

Vue 官方周报 #124 - 使用JSDoc记录组件属性

Hi &#x1f44b; 当你将鼠标悬停在IDE中的组件上时&#xff0c;显示组件属性所对应的描述&#xff0c;这个功能在开发过程中会很有用。你可以在传递给defineProps函数的TypeScript接口中使用JSDoc来实现这一点&#xff1a; MyComponent.vue <script setup lang"ts&…

【音视频 | AAC】AAC格式音频文件解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

ffplay工具

在编译ffmpeg时&#xff0c;如果系统中包含了SDL库&#xff0c;则会默认编译生成ffplay工具&#xff0c;否则无法生成ffplay工具。 ffplay即可以作为播放器&#xff0c;也可以作为很多图像化音视频数据的分析工具&#xff0c;通过它可以看到视频图像的运动估计方向、音频数据的…

大创项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

Python知识(1/20):变量、表达式、什么是程序?

23年是AI井喷的一年&#xff0c;我对AI的态度是恐惧的&#xff0c;以往我只需要CRUD就能需要的工作&#xff0c;AI能够编写出来&#xff0c;虽然现在还有很多缺陷&#xff0c;但是我比较喜欢向前看&#xff0c;在我未来我感觉我能遇到我被AI替代的那天。 我该怎能么办呢&#…

基于APB总线的SM4密码协处理器实现(附Verilog代码)

基于APB总线的SM4密码协处理器实现&#xff08;附Verilog代码&#xff09; 本文内容摘要理论依据和设计内容SM4分组密码算法APB_slave协处理器 测试过程与结果调试经历测试结果SM4.0部分测试APB协处理器部分测试 整体代码 本文内容摘要 本文使用Verilog语言实现SM4加密协处理器…

智能养殖解决方案:如何利用485转WiFi无线路由

随着科技的发展&#xff0c;智能养殖已经成为了一种新兴的生产方式。智能养殖不仅可以提高养殖效率和质量&#xff0c;还可以减少资源浪费和环境污染。其中&#xff0c;485转WiFi无线路由器作为智能养殖解决方案中的重要组成部分&#xff0c;发挥着关键的作用。以下将从三个方面…

多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BiTCN-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现BiTCN-Multihea…

IP子网划分【专题突破】

1、IP地址基础 IPv4地址是32位&#xff0c;采用点分十进制方式表示&#xff0c;其次必须掌握二进制的转换。 IPv6地址是128位&#xff0c;采用冒号分隔的十六进制表示方法。 2、IP地址的分类 RFC1918规定的私有地址 A类地址范围&#xff1a;10.0.0.0-10.255.255.255(1个A类…

EasyExcel使用: RGB字体,RGB背景颜色,fillForegroundColor颜色对照表

EasyExcel使用: RGB字体&#xff0c;RGB背景颜色&#xff0c;fillForegroundColor颜色对照表 使用EasyExcel导出表格可能会对字体颜色和单元格背景颜色进行自定义的修改。 可以自定义字体颜色或者每个单元格的颜色 要想自定义颜色&#xff0c;需要重写CellWriteHandler接口&am…

java使用websocket搭建客户端和服务端

maven <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.4</version> </dependency>客户端 package demo.wsdemo;import java.net.URI; import java.net.URISyntaxE…

CAS为什么还存在线程安全问题(从所谓的ABA问题再学CAS)

概述 之前学习 CAS&#xff0c;从 Java 代码层面知道其原理&#xff0c;借助一条 CPU 原子指令&#xff0c;通过不断地自旋去比较&#xff08;compare&#xff09;和&#xff08;and&#xff09;赋值&#xff08;set&#xff09;。当时对线程安全的认知停留在将多条 Java 语句…