当前位置: 首页 > news >正文

条款22:将成员变量声明为private

1.前言

首先,我们应该利用反证法,看看为什么成员变量不该是public,然后再了解所有反对public成员变量的论点同样适用于protected成员变量。最后得出一个结论:成员变量应该是private

2.为什么不用public

如果成员变量不是public,客户唯一能够访问对象的办法就是通过成员函数。如果public接口内的每样东西都是函数,客户就不需要在打算访问class成员时迷惑地试着记住是否该使用小括号。他们只要做就是了,因为每样东西都是函数。

使用函数可以让你对成员变量的处理有着更精确的控制,,如果你令成员变量为public,每个人都可以读写它,但如果你以函数取得或设定其值,你就可以实现出“不准访问”,“只读访问”以及“读写访问”,甚至可以实现“唯写访问”,见以下代码:

class AccessLevels{public:....int getReadOnly() const (return readOnly;)void setReadWrite(int value) { readWrite=value;}int getReadWrite() const (return readWriter;)void setWriteOnly(int value) {writeOnly = value;}private:int noAccess;//对此int无任何访问动作int readOnly;//对此int做只读访问int readWrite;//对此int做读写访问int writeOnly;//对此int做唯写访问
};

如此细微地划分访问控制颇有必要,因为许多成员变量应该被隐藏起来。每个成员变量都需要一个getter函数和setter函数是非常少见的。

如果此时还不够有说服力,那就从封装性的角度出发进行分析。如果通过函数访问成员变量,日后可以更改某个计算替换这个成员变量,而class客户一点也不会知道class内部已经实现了变化。举个例子:假设一个自动测序程序,当汽车通过时,其速度便被计算并填入一个速度收集器内:

class SpeedDataCollection{...public:void addValue(int speed);//添加一笔新数据double averageSoFar() const;//返回平均速度....
};

现在让我们考虑成员函数averageSoFar()。做法之一是在class内设计一个成员变量,记录至今以来的所有速度平均值。当averageSoFar被调用,只需要返回那个成员变量就好,该做法会使得每一个SpeedDataCollection对象变大,因为你必须为用来存放目前平均值,累计总量,数据点数的每一个成员变量分配空间,然而averageSoFar却可十分高效,它可以只是一个返回目前平均值的inline函数。另一个做法是令averageSoFar每次被调用时重新计算平均值,此函数有权力调取收集器内的每一笔速度值,该方法会使得averageSoFar执行较慢,但每一个SpeedDataCollection对象比较小。所以总体来说这两个方法各有优缺点。

3.总结

(1)切记将成员变量声明为private,这可赋予客户访问数据的一致性,可细微划分访问控制。允诺约束条件获得保证,并提供class作者以充分的实现弹性。

(2)protected并不比public更具封装性

相关文章:

条款22:将成员变量声明为private

1.前言 首先,我们应该利用反证法,看看为什么成员变量不该是public,然后再了解所有反对public成员变量的论点同样适用于protected成员变量。最后得出一个结论:成员变量应该是private。 2.为什么不用public 如果成员变量不是publ…...

PTA 7-224 sdut-C语言实验-排序问题

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。 输入格式: 输入数据有一行,包含10个整数,用空格分开。 输出格式: 输出数据有两行,第一行为排序后的序列,第二行为排序…...

【JavaScript】3.2 JavaScript性能优化

文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分,JavaScript也不例外。在这个章节中,我们将探讨如何优化JavaScript代码&…...

pytorch bert实现文本分类

以imdb公开数据集为例,bert模型可以在huggingface上自行挑选 1.导入必要的库 import os import torch from torch.utils.data import DataLoader, TensorDataset, random_split from transformers import BertTokenizer, BertModel, BertConfig from torch import…...

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…...

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters

MSLTNet开源 | 4K分辨率125FPS8K的参数量,怎养才可以拒绝这样的模型呢? 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现,但它们通常在高分辨率照片上具有大量的参数数量和沉…...

网络初识:局域网广域网网络通信基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、局域网LAN是什么?二、广域网是什么:三. IP地址四.端口号五.认识协议5.1五元组 总结 前言 一、局域网LAN是什么? 局域网…...

JVM之jps虚拟机进程状态工具

jps虚拟机进程状态工具 1、jps jps:(JVM Process Status Tool),虚拟机进程状态工具,可以列出正在运行的虚拟机进程,并显示虚拟机执 行主类(Main Class,main()函数所在的类)的名称&#xff0c…...

C++实现顺序栈的基本操作(扩展)

#include <stdio.h> typedef char ElemType; #define StackSize 100 /*顺序栈的初始分配空间*/ typedef struct { ElemType data[StackSize]; /*保存栈中元素*/int top; /*栈顶指针*/ } SqStack; void InitStack(SqStack &st) {st.top-1; } …...

用python写一个简单的爬虫

爬虫是一种自动化程序&#xff0c;用于从互联网上获取数据。它能够模拟人类浏览网页的行为&#xff0c;访问网页并提取所需的信息。爬虫在很多领域都有广泛的应用&#xff0c;例如数据采集、信息监控、搜索引擎索引等。 下面是一个使用Python编写的简单爬虫示例&#xff1a; …...

分布式追踪

目录 文章目录 目录自定义指标1.删除标签2.添加指标3.禁用指标 分布式追踪上下文传递Jaeger 关于我最后最后 自定义指标 除了 Istio 自带的指标外&#xff0c;我们还可以自定义指标&#xff0c;要自定指标需要用到 Istio 提供的 Telemetry API&#xff0c;该 API 能够灵活地配…...

make -c VS make -f

make 是一个用于构建&#xff08;编译&#xff09;项目的工具&#xff0c;它通过读取一个名为 Makefile 的文件来执行构建任务。make 命令有很多选项和参数&#xff0c;其中包括 -c 和 -f。 make -c&#xff1a; 作用&#xff1a;指定进入指定的目录并执行相应的 Makefile。 示…...

Unity 代码控制Color无变化

Unity中&#xff0c;我们给Color的赋值比较常用的方法是&#xff1a; 1、使用预定义颜色常量&#xff1a; Color color Color.white; //白色 Color color Color.black; //黑色 Color color Color.red; //红色 Color color Color.green; //绿色 Color color Color.blue; …...

【Erlang进阶学习】2、匿名函数

受到其它一些函数式编程开发语言的影响&#xff0c;在Erlang语言中&#xff0c;将函数作为一个对象&#xff0c;赋予其“变量”的属性&#xff0c;即为我们的匿名函数 或 简称 fun&#xff0c;它具有以下特性&#xff1a; &#xff08;匿名函数&#xff1a;不是定义在Erlang模…...

肖sir__mysql之视图__009

mysql之视图 一、什么是视图 视图是一个虚拟表&#xff08;逻辑表&#xff09;&#xff0c;它不在数据库中以存储形式保存&#xff08;本身包含数据&#xff09;&#xff0c;是在使用视图的时候动态生成。 二、视图作用 1、查询数据库中的非常复的数据 例如&#xff1a;多表&a…...

FPGA falsh相关知识总结

1.存储容量是128M/8 Mb16MB 2.有256个sector扇区*每个扇区64KB16MB 3.一页256Byte 4.页编程地址0256 5&#xff1a;在调试SPI时序的时候一定注意&#xff0c;miso和mosi两个管脚只要没发送数据就一定要悬空&#xff08;处于高组态&#xff09;&#xff0c;不然指令会通过两…...

升辉清洁IPO:广东清洁服务“一哥”还需要讲好全国化的故事

近日&#xff0c;广东物业清洁服务“一哥”升辉清洁第四次冲击IPO成功&#xff0c;拟于12月5日在香港主板挂牌上市。自2021年4月第一次递交招股书&#xff0c;时隔两年半&#xff0c;升辉清洁终于拿到了上市的门票。 天眼查显示&#xff0c;升辉清洁成立于2000年&#xff0c;主…...

Python自动化办公:PDF文件的分割与合并

我们平时办公中&#xff0c;可能需要对pdf进行合并或者分割&#xff0c;但奈何没有可以白嫖的工具&#xff0c;此时python就是一个万能工具库。 其中PyPDF2是一个用于处理PDF文件的Python库&#xff0c;它提供了分割和合并PDF文件的功能。 在本篇博客中&#xff0c;我们将详细…...

破解app思路

1.会看smali代码逻辑 一.快速定位关键代码 1.分析流程 搜索特征字符串 搜索关键 api 通过方法名来判断方法的功能 2.快速定位关键代码 反编译 APK 程序 AndroidManifest.xml>包名/系统版本/组件 程序的主 activity(程序入口界面) 每个 Android 程序…...

背景特效插件:Background Effects

...

三步掌握EdgeRemover:Windows系统Edge浏览器专业卸载方案

三步掌握EdgeRemover&#xff1a;Windows系统Edge浏览器专业卸载方案 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 还在为Windows系统中Microsoft Ed…...

[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通

[FFXIVChnTextPatch]&#xff1a;国际服中文补丁解决方案——从入门到精通 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 一、问题引入&#xff1a;当语言成为游戏体验的隐形壁垒 你是否曾在探索艾欧泽亚大陆时…...

线程池核心参数与拒绝策略深度解析

前言 线程池是Java并发编程中最常用的工具之一&#xff0c;但很多开发者只停留在“会用”层面。面试中&#xff0c;面试官往往通过线程池考察你对并发编程的理解深度——参数如何设置&#xff1f;为什么这样设置&#xff1f;拒绝策略如何选择&#xff1f; 本文将深入剖析线程池…...

智能工单管理系统 2026 怎么挑?五款热门平台对比,适配企业各类业务场景

工单智能化应用&#xff1a;帮您告别工单苦海 传统工单系统的痛点&#xff0c;本质是信息处理效率与用户体验的矛盾。随着AI 的发展&#xff0c;工单智能化应用的核心逻辑转变为&#xff0c;通过AI技术将“人找信息”转变为“信息找人”&#xff0c;甚至“预测需求”。 工单管…...

终极指南:如何用LanceDB向量数据库构建智能学习资源检索系统

终极指南&#xff1a;如何用LanceDB向量数据库构建智能学习资源检索系统 【免费下载链接】lancedb Developer-friendly, serverless vector database for AI applications. Easily add long-term memory to your LLM apps! 项目地址: https://gitcode.com/gh_mirrors/la/lanc…...

AutoSar标准文档下载全攻略:从官网入口到模块选择(附命名规则解析)

AutoSar标准文档高效获取与深度解析指南 引言 在汽车电子系统开发领域&#xff0c;AutoSar标准已经成为行业公认的架构规范。无论是ECU开发工程师、系统架构师还是测试验证人员&#xff0c;都需要频繁查阅AutoSar官方文档。然而&#xff0c;面对庞大的文档体系和复杂的命名规则…...

Ubuntu 24.04 环境实战:ROS 2 Kilted 实现 SLAM 建图与 Nav2 导航

一、构建地图 1、安装依赖 安装 slam_toolbox 算法库&#xff1a; sudo apt install ros-kilted-slam-toolbox安装 TurtleBot3 全套支持包&#xff1a; sudo apt install ros-kilted-turtlebot3*2、使用清华源 如果apt安装很慢&#xff0c;请先配置清华源&#xff1a; sud…...

Git 代码库中找回丢失文件的实用指南

1. 为什么Git能帮你找回丢失的代码&#xff1f; 作为开发者&#xff0c;你一定遇到过这样的场景&#xff1a;不小心执行了rm -rf删错了文件&#xff0c;或者手滑把整个功能模块给覆盖了。这时候千万别慌&#xff0c;Git就像个贴心的时光机&#xff0c;能帮你找回99%的丢失文件。…...

ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例)

ROS2接口实战&#xff1a;从传感器数据到自定义消息的完整开发流程&#xff08;附Python示例&#xff09; 在机器人开发领域&#xff0c;数据的高效传递与标准化处理是系统稳定运行的关键。ROS2作为新一代机器人操作系统&#xff0c;其接口系统提供了强大的数据交换能力&#x…...

ReplaceItems.jsx:Adobe Illustrator批量对象替换的终极解决方案

ReplaceItems.jsx&#xff1a;Adobe Illustrator批量对象替换的终极解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 还在为Illustrator中重复的替换操作而烦恼吗&#xff1…...