15.9为什么要将成员变量设置为private

2023-05-16

为什么要将成员变量声明为private

为什么要将成员变量封装为private,主要有以下四个原因:

①好处1:如果成员变量不是public,那么客户唯一能访问成员变量的唯一方式就是通过成员函数。如果public接口内的每样东西都是接口函数,那么客户在访问类是就不需要考虑用不用使用(),因为每样东西都是函数,都需要用()。

②好处2:可以使对成员变量的处理更加精确。如果你令成员变量为public的,那么每个人都可以读写它;但是如果你将它声明为private的,你可以根据自己需求实现“不准访问”、“只读访问”、“只写访问”、“读写访问”。

如:通过以下成员函数就可以实现对封装起来的成员变量的精准控制。

class AccessLevels {
public:
    ...                //构造函数等
    int getReadOnly() const {
        return readOnly;
    }
    
    void setWriteOnly(int val) {
        writeOnly = val;
    }
    
    void setReadWrite(int val) {
        readWrite = val;
    }
    
    int getReadWrite() const {
        return readWrite;
    }
    
private:
    int noAccess;      //禁止访问的成员变量
    int readOnly;      //只读成员变量
    int writeOnly;     //只写成员变量
    int readWrite;     //读写成员变量
};

③好处3:封装。如果你通过函数访问成员变量,日后可改以某个计算来替换这个成员变量,而class用户一点也不会知道class内部已经出现了变化,为访问成员变量的实现提供更多可能。

如:我们要访问数组的平均值,一种方法是设立一个平均值的成员变量,并且定义一个成员函数,每次只需要返回成员变量的值就行了;或者另一种方法,不定义成员变量,直接定义一个计算平均值的函数,每次调用的时候计算平均值。

这样当我们为了节省内存改变了MyArray结构时,用户可以继续调用getAvg()的接口,而不会感觉到类其实内部已经发生了变化。

//方法1:定义成员变量每次返回成员变量的值
class MyArray {
public:
    ... //构造函数等
    int getAvg() const {
        return avg;
    }
private:
    vector<int> arr;
    int avg;
};

//方法2:不定义成员变量,直接定义一个计算平均值的函数
class MyArray {
public:
    ... //构造函数等
    int getAvg() const {
        int sum = 0;
        for (int i : arr) {
            sum += i;
        }
        return sum / arr.size();
    }
private:
    vector<int> arr;
};

好处④public和protected意味着不封装,不封装意味着不能改变。如果不封装,我们之后将public或protected的成员变量改变成private之后,将会破坏大量的用户的代码。

如:求数组平均值的类,我们不进行封装,用户直接使用了这些不封装的类。

//不封装的求数组平均值的类
class MyArray {
public:
    ...//其他成员函数
    vector<int> arr;
    int avg;
};

//用户代码
int main() {
    Myarray nums;
    nums.arr.push_back(10);
    nums.arr.push_back(10);
    nums.arr.push_back(10);
    cout << nums.avg << endl;
    return 0;
}

当我们之后又想将arr和avg变成private时会发现用户的代码出现的大量的错误,如果要修改将会耗费大量的力气。

//不封装的求数组平均值的类
class MyArray {
public:
    ...//其他成员函数
private:
    vector<int> arr;
    int avg;
};

//用户代码
int main() {
    Myarray nums;
    nums.arr.push_back(10);    //错误:没有权限访问MyArray::arr变量
    nums.arr.push_back(10);
    nums.arr.push_back(10);
    cout << nums.avg << endl;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15.9为什么要将成员变量设置为private 的相关文章

  • 为什么 Ruby 不允许我在私有方法中指定 self 作为接收者?

    Ruby 作为一种面向对象的语言 这意味着无论我发送什么消息 我都严格在类的某个对象 实例上发送它 Example class Test def test1 puts I am in test1 A public method self t
  • C++ 类成员初始化顺序

    我知道在一个class成员按照列出的顺序进行初始化 这是否适用于将变量分组为public and privateETC 我的困惑是我无法弄清楚是否存在诸如private成员按照之前列出的顺序进行初始化public成员 无论私有变量在类声明中
  • signature.verify() 总是返回 False

    public static void main String args try String mod q0AwozeUj0VVkoksDQSCTj3QEgODomq4sAr02xMyIrWldZrNHhWfZAIcWt2MuAY3X6S3Z
  • 如何通过Flickrj Api访问私人照片?

    我正在通过 Flickr API 进行经过身份验证的调用来访问照片 但我只得到我的公开照片 而没有任何私人照片 下面给出的是我正在使用的代码 Flickr f RequestContext requestContext String fro
  • GitHub 克隆错误:无法克隆并出现 EOF 错误

    我正在尝试使用 Ubuntu 13 04 从 GitHub 私人存储库克隆我的项目 我总是收到如下错误 error RPC failed result 18 HTTP code 200 17 KiB s fatal The remote e
  • js动态访问私有字段(属性/成员)

    我正在尝试新的类私有成员特征 https developer mozilla org en US docs Web JavaScript Reference Classes Class fields Private fields 然而 我很
  • C++ 将源文件中的某些函数设为私有的最佳方法是什么?

    myclass h pragma once void publicFunction myclass cpp include myclass h include
  • Python 继承 - 如何禁用函数

    在 C 中 您可以通过在子类中将其声明为私有来禁用父类中的函数 在 Python 中如何做到这一点 IE 如何从孩子的公共界面隐藏父母的功能 Python 中确实不存在任何真正的 私有 属性或方法 您可以做的一件事就是简单地重写子类中不需要
  • 当类型信息不可用时如何转换为私有内部类?

    我有类似以下情况 In some library code public class A private class B Object value In my code Object o o is initialized to an ins
  • C# 中的私有静态变量和线程安全

    我的一位同事在多线程 C 应用程序中编写了以下代码 public class1 private static partialClass var1 new partialNonStaticClass public static method1
  • 使用私有 Bitbucket Mercurial 存储库配置composer.json

    我的项目使用我自己的库 该库位于 bitbucket org 上的私人 Mercurial 存储库中 该库没有配置composer json 我尝试将该库作为我的项目的依赖项 首先 我向composer json写入以下字符串 requir
  • 访问继承中的私有成员

    我有一个 A 类 其中有一个字段 val 声明为私有 我想声明一个类 B 它继承自 A 并可以访问 val 有没有办法在C 上做到这一点 我想这样做是因为我需要重载A的一些函数 而不需要改变A的代码 Thanks 快速回答 你不知道 这就是
  • Java反射带参数的私有方法最好的方法是什么?

    我正在尝试使用java反射调用私有方法我开发了一个小方法来调用其他方法迭代所有方法并按名称和参数类型进行比较我已成功调用4个方法 我有一个问题 1 这是最好的方法吗 因为我知道 class getMethod 仅匹配公共方法 Java有内置
  • 包的导入会改变类的可见性吗?

    我刚刚了解到 一个类可以用 修饰符 public 在这种情况下 类对所有类可见 到处 如果一个类没有修饰符 默认值 也称为 包私有 仅可见 在它自己的包中 这是一个明确的声明 但这些信息干扰了我对包导入的理解 这很容易出错 我认为导入包会使
  • 来自私有 GitHub 存储库的 Cordova 插件

    从私有 GitHub 存储库安装 Cordova 插件的首选方法是什么 我从供应商处购买了一个私有插件 该供应商授予我的 git 帐户访问其私有 git 存储库的权限 通常我从 cordova cli 安装插件 cordova plugin
  • JS 私有方法不会在每次构造函数调用时重新定义

    如何创建一个每次调用构造函数时都未定义的 Javascript 私有方法 据我所知 在OOP JS中 私有方法是在 类 的 构造方法 中定义的方法 每次实例化一个新的 对象 时都会调用 我在想也许是一个函数声明 即function name
  • C 中带有 const 的“私有”结构成员

    为了拥有干净的代码 使用一些 OO 概念可能很有用 即使在 C 中也是如此 我经常编写由一对 h 和 c 文件组成的模块 问题是模块的用户必须小心 因为 C 中不存在私有成员 使用 pimpl 习惯用法或抽象数据类型是可以的 但它添加了一些
  • DART:扩展类中抽象方法的实现

    我在文件 myclass dart 中有两个类 abstract class A myAbstractMethod class B extends A 此时编译显示 MISSING CONCRETE IMPLEMENTATION OF一 方
  • Java中私有静态变量有什么用?

    如果一个变量被声明为public static varName 然后我可以从任何地方访问它ClassName varName 我还知道静态成员由类的所有实例共享 并且不会在每个实例中重新分配 将变量声明为private static var
  • 设计决策:为什么以及何时将接口设为私有?

    设计决策中是否使用过私有接口 如果是这样 原因是什么 您什么时候知道需要私有接口 A 顶层接口不能是私有的 它只能有public或包访问 来自Java 语言规范 第 9 1 1 节 接口修饰符 https docs oracle com j

随机推荐

  • 电磁循迹智能车基于stm32cubeMX、HAL库—我的第一辆智能车

    我的第一辆智能车 电磁循迹智能车 提示 本文适用于初学 想完成一个基础四轮车练练手者 大佬还请勿喷 不过欢迎提出意见 有纰漏之处我将及时纠正 注 工程代码链接已贴在文末 前言 所用到的硬件平台 stm32f103c8t6 舵机 电机 L29
  • 2022年国赛建模B题思路与程序

    B题 无人机遂行编队飞行中的纯方位无源定位 关键词搜索 xff1a 无人机 xff0c 无源定位 其实这个工作特别多 xff0c 知网一堆 xff0c 如果选这个题一定要想好做的出彩 xff0c 另外网上的场景和本题不是很一样 xff0c
  • 2017全国大学生电子设计竞赛:室内可见光定位装置

  • 基于FreeRTOS下多任务的同时操作

    FreeRTOS移植及多任务的实现 前言 xff1a 一 FreeRTOS移植 xff08 1 xff09 移植准备工作 xff08 2 xff09 FreeRTOS移植到stm32中 xff08 3 xff09 例程验证 二 多任务实现
  • undefined symbol 问题解决记录

    历经一个月 xff0c 昨日完成打印机network部分的编写 c语言 xff0c 编写makefile构建动态库 构建完成后遂进行调用测试 xff0c 出现 xff1a network symbol lookup error usr li
  • 2.O(NlogN)的排序算法

    认识O NlogN 的排序算法 1 剖析递归行为及其时间复杂度的估算 递归过程 xff1a 递归过程是一个多叉树 xff0c 计算所有树的结点的过程就是利用栈进行后序遍历 xff0c 每个结点通过自己的所有子结点给自己汇总信息之后才能继续向
  • 4.二叉树的遍历(C++版)

    二叉树的递归 1 二叉树递归遍历 二叉树的递归序 递归序过程 xff1a 两个注释1之间的代码代表第一次来到一个节点的时候 xff0c 会判断一下这个节点是否为空 xff1b 来到这个节点的左树去遍历 遍历完第二次回到本函数 xff0c 进
  • 6.暴力递归转动态规划

    动态规划 1 什么是动态规划 xff1f 动态规划就是暴力递归 xff08 回溯 xff09 的过程中有重复调用的过程 xff0c 动态规划在算过每次调用后把答案记下来 xff0c 下次再遇到重复过程直接调用这个行为就叫动态规划 动态规划就
  • 8.岛问题

    岛问题 题目 一个矩阵中只有0和1两种值 xff0c 每个位置都可以和自己的上 下 左 右四个位置相连 xff0c 如果有一片1连在一起 xff0c 这个部分叫做一个岛 xff0c 求一个矩阵中有多少个岛 xff1f 例子 0 0 1 0
  • 9.KMP算法

    KMP算法 1 KMP算法解决的问题 字符串str1和str2 xff0c str1是否包含str2 xff0c 如果包含返回str2在str1中开始的位置 xff0c 如果不包含返回 1 如果做到时间复杂度O N 完成 xff1f 测试用
  • 10.Manacher算法(用于解决回文子串问题)

    Manacher算法 1 Manacher算法解决的问题 字符串str中 xff0c 最长回文子串的长度如何求解 xff1f 如何做到时间复杂度O N 完成 xff1f 回文序列是从左往右和从右往左看一样 xff0c 如abba xff0c
  • git push代码到远程仓库,报错解决:fatal: unable to access ‘https://github.com/.......‘: OpenSSL SSL_read: Connec

    报错如下 xff1a 产生原因 xff1a 一般是这是因为服务器的SSL证书没有经过第三方机构的签署 xff0c 所以才报错解除ssl验证后 xff0c 再次git即可 解决办法输入此条git命令 xff1a git config glob
  • 11.滑动窗口的最大值——重要结构双端队列

    滑动窗口最大 xff08 小 xff09 值 1 滑动窗口最大值结构 窗口概念 xff1a 一开始窗口左边界L 有边界R都停留在数组左侧 xff0c 窗口L和R都只能往数组右边移动 xff0c 并且左边界L永远不能超过有边界R 任何时刻都能
  • 12.单调栈——解决接雨水和柱状图中的最大矩形等问题

    单调栈 1 单调栈实现结构 单调栈解决的问题 xff1a 给你一个数组 想要用尽可能低的代价知道数组中每一个元素的左边元素比它大的或者右边元素比他大的信息是什么 如果用暴力方法 xff0c 左边遍历一次右边遍历一次 xff0c 时间复杂度为
  • 12.快速排序

    1荷兰国旗问题 问题1 xff1a 给定一个数组arr和一个数num xff0c 将小于等于num的数放在数组的左边大于num的数放在数组的右边 xff08 不要求有序 xff09 要求额外空间复杂度为O 1 时间复杂度为O N 遍历数组元
  • 死锁预防、死锁避免、死锁检测

    死锁 1 死锁的概念 1 1死锁的定义 多个进程并发执行 xff0c 由于竞争资源而造成的一种僵局 xff08 互相等待 xff09 xff0c 若无外力作用 xff0c 这些进程都将无法推进 xff0c 这就是死锁现象 例如 xff1a
  • 内存分配方式

    内存分配方式 1 基本概念 内存管理的基本概念 虽然计算机硬件发展 xff0c 内存容量在不断变大 xff0c 但是也不可能将所有用户进程和系统所需要的程序和数据放入内存中 xff0c 因此操作系统必须要对内存空间进行合理划分和有效动态分配
  • 虚拟内存和LRU页面置换算法

    虚拟内存 1 虚拟内存的基本概念 传统存储管理方式的特征 传统的内存管理策略都是为了同时将多个进程保存进内存中 xff0c 它们具有以下的共同特征 xff1a 一次性 作业必须一次性全部装入内存后 xff0c 才能开始运行 xff08 静态
  • 0.0C++和C的区别

    C 43 43 和C的区别 C 43 43 如今是一个同时支持面向过程 面向对象 函数形式 泛型形式 元编程形式的语言 我们该如何理解C 43 43 这门语言呢 xff1f Effective C 43 43 书中给出了一个简单的方法 xf
  • 15.9为什么要将成员变量设置为private

    为什么要将成员变量声明为private 为什么要将成员变量封装为private xff0c 主要有以下四个原因 xff1a 好处1 xff1a 如果成员变量不是public xff0c 那么客户唯一能访问成员变量的唯一方式就是通过成员函数