「C++ 类和对象篇 15」C++中的私有成员

server/2024/9/19 17:50:50/ 标签: c++, 开发语言

目录

一、C++中私有成员的访问权限

二、私有成员的命名规范

三、C++对于私有成员的访问是由编译器来检查的 


一、C++中私有成员的访问权限

        C++私有成员访问权限是基于类的,而不是基于对象的。


        在 C++ 中,当你在类的成员函数内部访问私有成员时无论这个私有成员是属于当前对象(this)还是来自外部传入的本类对象,都不会报错。这是因为C++中私有成员访问权限是基于类的,而不是基于对象的。【不同与Java和Python】


下面是一个简单的例子来说明这一点:

class MyClass {  
private:  int privateMember;  public:  MyClass(int value) : privateMember(value) {}  void setPrivateMember(const MyClass& other) {  // 这里可以访问其他对象的私有成员,尽管是通过外部传入的对象  this->privateMember = other.privateMember;  }  int getPrivateMember() const {  return privateMember;  }  
};  int main() {  MyClass obj1(10);  MyClass obj2(20);  obj1.setPrivateMember(obj2); // obj1 现在有和 obj2 相同的私有成员值  std::cout << obj1.getPrivateMember() << std::endl; // 输出 20  return 0;  
}

在上面的代码中,setPrivateMember 成员函数接收一个 MyClass 类型的引用作为参数。尽管 privateMember 是私有成员,但在 setPrivateMember 函数内部,我们既可以访问当前对象的 privateMember(通过 this->privateMember),也可以访问传入对象的 privateMember(通过 other.privateMember)。这是因为成员函数内部有权限访问类的所有成员,无论这些成员是属于当前对象还是其他对象。

然而,需要注意的是,你不能从类的外部直接访问类的私有成员,即使你有一个类的对象。只有类的成员函数(包括友元函数和友元类)能够访问类的私有成员。


二、私有成员的命名规范

       在 C++ 中,单下划线前缀(_)或没有特殊前缀的标识符都可以用作私有成员的名称,并且通常遵循某种命名约定(例如,以下划线开头的名称表示私有成员)。

       另外,双下划线前缀(__)在 C++ 中并不用于私有成员的命名,而是用于实现编译器特定的名称修饰(name mangling),这通常用于避免名称冲突和提供某种形式的访问控制。但这并不是 C++ 语言标准的一部分,而且不同的编译器可能有不同的行为。因此,通常建议避免在成员名称中使用双下划线前缀,以免引入与编译器相关的行为。


三、C++对于私有成员的访问是由编译器来检查的 

        C++中对于私有成员的访问权限是由编译器在编译时进行检查的。编译器确保只有本类的成员函数(包括构造函数和析构函数)、友元函数以及友元类能够直接访问类的私有成员。任何尝试从类的外部或非友元函数中直接访问私有成员的代码都会导致编译错误。

        编译器在编译过程中会分析代码的语义,包括类的定义、成员函数的实现以及对象的使用。当编译器遇到尝试访问私有成员的代码时,它会检查当前的作用域和访问上下文,以确定该访问是否合法。如果访问发生在类的成员函数内部或友元函数/友元类中,编译器就会允许这种访问。否则,编译器会发出错误消息,指出私有成员不可访问。


------------------------END-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。


http://www.ppmy.cn/server/27725.html

相关文章

JavaScript基础(二)

JS语法结构——引入方式 js很明显可以是一个后缀名为js的文件&#xff0c;js的引入方式和css一样&#xff0c;也有三种方式。 1.外部 使用script表现&#xff0c;只不过增加一个src属性&#xff0c;把js文件的路径src属性中。 <script src "js文件路径">&l…

如何保证每次画出的都同一张人脸?AI绘画Stable Diffusion的Reference only教程

Ai绘画有一个很现实的问题&#xff0c;要保证每次画出的都是同一个人物的话&#xff0c;很费劲。 Midjourney就不必说了&#xff0c;人物的高度一致性一直得不到很好的解决。而在Stable Diffusion&#xff08;SD&#xff09;中&#xff0c;常用办法是通过同一个Seed值&#xf…

【PC游戏】【World of Warcraft 魔兽世界(法语版)】怀旧版 CD-ROM 安装及使用记录(一)

一、前言 正值最近暴雪和网易重修旧好之时&#xff0c;笔者在新加坡从一个宅男朋友nerd bro那里淘到了一套法语版的World of Warcraft&#xff0c;共5张CD-ROM光碟。该套光碟的发行年份是2005年&#xff0c;于欧盟制造。推荐的操作系统是Windows 2000或者Windows XP或者Mac OS…

python 笔记:cls VS self

cls&#xff1a; 用于类方法&#xff1a; cls 通常作为类方法&#xff08;用 classmethod 装饰&#xff09;中的第一个参数。它指代调用该方法的类本身&#xff0c;无论该类有没有被实例化访问类级别的属性和方法 通过 cls&#xff0c;可以访问类级别的属性和方法。可以通过 c…

[第五空间-2021]yet_another_mysql_injection

title:[第五空间 2021]yet_another_mysql_injection 查看网页源码 访问view-source:node4.anna.nssctf.cn:28356/?source 得到题目源码 <?php include_once("lib.php"); function alertMes($mes,$url){die("<script>alert({$mes});location.href{…

android 判断文件是否存在

在 Android 中&#xff0c;你可以使用 java.io.File 类来判断一个文件是否存在。下面是一个简单的示例代码&#xff1a; import java.io.File; public class FileChecker { public static boolean isFileExist(String filePath) { File file new File(fi…

【Jenkins】持续集成与交付 (五):Jenkins用户权限管理

🟣【Jenkins】持续集成与交付 (五):Jenkins用户权限管理 1、安装插件(Role-based Authorization Strategy)2、开启权限全局安全配置3、创建角色4、创建用户5、给用户分配角色6、测试权限💖The Begin💖点点关注,收藏不迷路💖 1、安装插件(Role-based Authorization …

word 表格 文字 上下居中

问题 word 表格 文字 上下居中 详细问题 笔者进行word 文档编辑&#xff0c;对于表格中的文本内容&#xff0c;如何进行上下居中&#xff1f; 解决方案 步骤1、选中需要进行操作的单元格 步骤2、右键 → \rightarrow →点击表格属性 步骤3、依次点击单元格 → \rightar…

12、Flink 的 Keyed State 代码示例

1、KeyedState 用例 import org.apache.flink.api.common.functions.AggregateFunction; import org.apache.flink.api.common.functions.ReduceFunction; import org.apache.flink.api.common.state.*; import org.apache.flink.api.common.typeinfo.TypeHint; import org.ap…

Java中的模版方法设计模式详解

Java中的模版方法设计模式详解 在Java编程中&#xff0c;设计模式是一种解决常见问题的最佳实践。其中&#xff0c;模版方法设计模式是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。这样可以使子类在不改变算法结构的情况…

社交媒体数据恢复:Soul

Soul数据恢复方法 在Soul这款社交软件中&#xff0c;如果您的聊天记录不小心被删除&#xff0c;是否还能恢复呢&#xff1f;以下是根据搜索结果整理出的Soul数据恢复方法。 方法一&#xff1a;使用Soul的备份和恢复功能 开启备份功能&#xff1a;首先&#xff0c;您需要确保…

PS证件照

证件照尺寸 小一寸&#xff1a;2.2cm*3.3cm 一寸&#xff1a;2.5cm*3.5cm 像素413*295 &#xff08;分辨率为300像素/英寸&#xff09; 比例5&#xff1a;7 二寸&#xff1a;3.5cm*4.9cm 二寸照相比例是4&#xff1a;3&#xff0c;像素是626*413 蓝底&#xff1a;R&a…

Java面试八股之简述Java中assert的作用

简述Java中assert的作用 Java中的assert关键字用于在代码中插入断言&#xff08;Assertion&#xff09;&#xff0c;断言是一种在开发和测试阶段用于验证程序内部状态或假设的机制。其主要作用包括&#xff1a; 条件检查&#xff1a; assert语句用于在特定代码点上检查一个布…

【prometheus】监控MySQL并实现可视化

目录 一、概述 1.1下载解压mysqld_exporter 1.2创建MySQL授权用户 1.3配置my.cnf 1.4启动mysqld_exporter 1.5prometheus配置修改 二、Grafana展示 【Prometheus】概念和工作原理介绍_prometheus工作原理 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集…

OneFlow快速上手:深度学习初学者必备【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

Mysql优化之参数调优

前言 MySQL参数优化是针对数据库配置参数的调整和优化&#xff0c;以提高数据库系统的性能、稳定性和可用性。它和Mysql的应用环境例如项目的用户量在线情况、访问情况、存储资源量等以及服务硬件配置都有关系&#xff0c;优化也不可能一次性完成&#xff0c;需要不断的观察以…

Flink 实时数仓(一)【实时数仓离线数仓对比】

前言 昨天技术面的时候&#xff0c;面试官说人家公司现在用的都是最新的技术&#xff0c;比如 Doris 等一些最新的工具&#xff0c;确实这些课是学校永远不会开设的&#xff0c;好在他说去了会带着我做一做。可是 ...... 学院这边确实不允许放人&#xff0c;唉&#xff0c;可惜…

qt对话框功能介绍

1、颜色对话框 //方式一QColor color QColorDialog::getColor(Qt::red, this, QString::fromLocal8Bit("颜色对话框"),QColorDialog::ShowAlphaChannel);qDebug() <<"color:" <<color;//方式二QColorDialog dialog(Qt::red, this); // 创建对…

3.9设计模式——Strategy 策略模式(行为型)

意图 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使他们可以相互替换此模式使得算法可以独立于使用它们的客户而变化 结构 Strategy&#xff08;策略&#xff09;定义所有支持的算法的公共入口。Context使用这个接口来调用某ConcreteStrategy定义的方…

口袋实验室--使用AD2高效调试IIC、UART、SPI等低速接口

目录 1. 简介 2. 调试过程 2.1 简要步骤 2.2 Si5338 寄存器配置流程 2.3 AD2的基本配置 2.4 检查Si5338状态 2.5 配置Si5338寄存器 2.6 保存Si5338寄存器 3. 总结 1. 简介 使用Digilent Analog Discovery 2进行调试不仅提升了工作效率&#xff0c;而且极大地简化了常…