C++:类的成员属性,公有,私有,保护

news2024/11/19 8:43:11

在C++中级别,类的成员属性分为三种访问控制:公有(public)私有(private)保护(protected)。它们用于控制类内部数据对类外部的可见性和访问权限。设置访问属性对于封装和信息隐藏至关重要,它有助于保持代码的模块化、安全性和灵活性。正确的访问控制可以帮助防止意外的数据修改和提高代码复用性。

公有 (Public): 公有成员可以直接在类的外部被访问和修改。这是默认的访问属性,如果没有特别声明,成员函数和变量都是公有的。

私有 (Private): 私有成员仅能在类本身的内部访问。外部代码无法直接访问或修改私有成员,只有类内的成员函数(称为友元函数)以及该类的构造函数、析构函数等特殊成员才能访问。

保护 (Protected): 保护成员在类的派生类中可以被访问,但在基类之外则不可见。通常用在继承层次结构中,让派生类能够访问到基类的一些内部细节,但为了防止滥用,仍然限制了其外部可见性。

公有属性(Public Members)

公有属性(也称为公共数据成员)是指可以直接从类的外部访问的成员变量。当你声明一个公有变量或函数时,其他程序员可以在创建该类的对象时直接操作这些属性,无需通过类的实例。

class MyClass {
public:
    // 公有属性
    int publicVar;
    void publicMethod() {
        // 公有函数
    }
};

这里,publicVarpublicMethod() 可以在类外通过 MyClass 对象直接访问。这提供了程序的封装性和灵活性,允许其他部分控制数据的访问,同时保持结构清晰。

在C++中,公有属性(Public Members)是类的成员变量,它们可以被类的所有外部程序直接访问和修改,因为它们的访问权限设置为public。这使得其他程序员能够方便地操作类的对象,实现数据的共享。以下是公有属性的一些常见应用:

1、封装性:虽然公有属性允许外部访问,但是通过封装原则,你可以提供getter和setter方法(也称为访问修饰符),用于控制数据的读取和修改,避免直接暴露内部细节。

2、交互设计:在设计类的时候,如果某个数据对所有用户都是可见且需要频繁操作的,将其设为公有属性是合理的。比如在图形界面中,窗口的位置和大小通常是公开的。

3、继承与多态:在派生类中,公有属性可以直接继承并被重写,实现了多态性,让子类能改变或扩展其父类的行为。

class Base {
public:
    int value; // 公有属性
};

class Derived : public Base {
public:
    void setValue(int new_value) { value = new_value; } // setter方法
    int getValue() const { return value; } // getter方法
};

私有属性(Private Members)

在C++中,私有属性(Private Members)是一种访问控制修饰符,用于声明成员变量(数据成员)或函数(方法)。它们的主要特点是只能在该类内部直接访问,外部(包括派生类)无法直接读取或修改这些私有元素,这提供了一种封装机制,保护了类的数据不被随意篡改。

当你将一个成员声明为私有的时候,通常会提供一些公共方法(公有成员函数或getters/setters)作为接口,允许外部代码安全地操作这些私有数据。这样做有助于维护代码的完整性,并通过隐藏内部细节来提升代码的模块性和重用性。

class MyClass {
private:
    int privateValue; // 私有数据成员

public:
    // 公有方法获取私有值
    int getPrivateValue() const { return privateValue; }

    // 公有方法设置私有值
    void setPrivateValue(int value) { privateValue = value; }
};

保护属性(protected members

在C++中,保护属性(protected members)是一种访问控制级别,用于成员变量和成员函数。它允许这些成员在类的内部以及派生类中直接访问,但对外部(非友元类)来说则是不可见的。这意味着在基类中声明为protected的成员:

  1. 可以被该类的公有成员函数以及私有成员函数访问。
  2. 在派生类中可以访问和修改,这使得它们可以在派生类中提供特定于派生的实现,同时保持原类的封装性。
  3. 对于外部类,只能通过派生类的对象间接访问,增加了程序的安全性和封装性。

保护属性通常用于那些不需要完全暴露给客户端但需要在子类之间共享的行为。例如,一些基类的内部细节可能会在派生类中有更合适的处理方式。

保护属性(也称为“受保护”)介于公有和私有之间,它的主要特点是:

受保护成员只能在其声明的类及其派生类内部访问。这意味着在基类中声明的受保护成员,只有直接或间接从基类派生出来的子类能访问它,而外部的函数或对象无法直接操作这些成员。

这种访问控制提供了一定程度的封装性和安全性,防止了意外的直接修改,同时又允许子类对其进行必要的继承和修改。例如,子类可以根据需要调整或扩展受保护的功能,但在基类中保持这部分细节隐藏。

保护属性(通常以protected关键字声明)的主要应用包括:

封装:它帮助隐藏实现细节,防止不必要的修改。其他类通过继承可以访问这些保护成员,提供了一种控制信息暴露的方式。

继承中的共享:当一个基类有一些数据需要被它的派生类访问时,可以将这些数据设为保护。这样,派生类可以在不改变基类接口的情况下扩展功能。

虚函数的实现优化:有时为了性能考虑,内部的数据结构可能会在基类中以保护方式存储,而虚函数的实现则在派生类中。

class BaseClass {
public:
    // 公有成员
    int publicData;

protected:
    // 保护成员
    int protectedData;
};

class DerivedClass : public BaseClass {
public:
    // 在派生类中可以访问基类的保护成员
    void accessProtected() {
        protectedData = 42; // 正常访问
    }

private:
    // 派生类有自己的私有成员
    int derivedPrivate;
};

int main() {
    DerivedClass d;
    d.publicData = 10; // 可见,因为是公有的
    d.accessProtected(); // 可见,因为DerivedClass继承了BaseClass

    // BaseClass的对象尝试访问protectedData是不允许的
    // BaseClass base;
    // base.protectedData = 50; // 错误,protectedData仅对DerivedClass可见

    return 0;
}

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

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

相关文章

Truffle学习笔记

Truffle学习笔记 安装truffle, 注意: 虽然目前truffle最新版是 5.0.0, 但是经过我实践之后, 返现和v4有很多不同(比如: web3.eth.accounts; 都获取不到账户), 还是那句话: “nodejs模块的版本问题会搞死人的 !” 目前4.1.15之前的版本都不能用了, 只能安装v4.1.15 npm instal…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件,然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

SCI二区TOP|麋鹿群优化算法: 一种新颖的受自然启发的元启发式算法

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,SO Oladejo受到麋鹿群的繁殖过程启发,提出了麋鹿群优化算法(Elk herd optimizer, EHO)。 2.算法原理 2.1算法思想 EHO灵感来自麋鹿…

Win11右键默认显示更多选项的方法

问题描述 win11系统默认右键菜单显示选项太少,每次需要点一下“显示更多选项”才能得到想要内容。比方说我用notepad打开一个文档,在win11上要先点一下"显示更多选项“,再选择用notepad打开,操作非常反人类。 Win11右键默…

FreeRTOS 任务

FreeRTOS使用多任务完成功能,首先要了解任务的基本知识。 裸机编程中,单任务系统的编程方式,即裸机的编程方式,这种编程方式的框架一般都是在 main()函数 中使用一个大循环,在循环中顺序地调用相应的函数以处理相应的…

【matlab】分类回归——智能优化算法优化径向基神经网络

目录 径向基(Radial Basis Function, RBF)神经网络 一、基本概念 二、网络结构 三、工作原理 四、学习算法 五、优点与应用 六、与BP神经网络的比较 智能优化算法 常见的智能优化算法 灰狼优化算法(Grey Wolf Optimizer, GWO&#…

万界星空科技MES系统中的排版排产功能

在当今高度竞争的市场环境中,企业对于生产管理的效率和质量要求日益提高。作为智能制造的重要组成部分,制造执行系统(MES)以其强大的功能,在提升企业生产能力方面发挥着不可替代的作用。万界星空科技作为行业领先的智能…

eclipse ide中文件编码的修改,解决中文乱码的问题。

1、先上一张图: 记得之前设置过,但是稍微一变,环境编码又到了ISO-8859-1了,然后就出现了乱码。 2、设置eclipse的编码: Preferences--General -- Content Types -- Text -- Java Properties File -- Default encoding…

昇思25天学习打卡营第18天 | 基于MobileNetv2的垃圾分类

内容介绍: MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络,相比于传统的卷积神经网络,MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小…

node.js外卖小程序-计算机毕业设计源码81838

摘要 自从计算机发展开始,计算机软硬件相关技术的发展速度越来越快,在信息化高速发展的今天,计算机应用技术似乎已经应用到了各个领域。在餐饮行业,除了外卖以外就是到店里就餐,在店里就餐如果需要等待点餐的话&…

complex复数库学习

此头文件是数值库的一部分。本篇介绍complex的基本用法。 常用的API如下: 运算 real 返回实部 (函数模板) imag 返回虚部 (函数模板) abs(std::complex) 返回复数的模 (函数模板) arg 返回辐角 (函数模板) norm 返回模(范数)的平方 (函数模板) conj 返回复共轭 (函…

开启视频创作新篇章!腾讯发布MimicMotion:单张图像+简单姿势,瞬间“活”化视频。

腾讯和上交发布了一个根据图片生成跳舞视频的项目MimicMotion。效果同时支持面部特征和唇形同步,不止可以搞跳舞视频,也可以做数字人。 MimicMotion方案优化的内容有: 引入基于置信度的姿态引导机制。确保生成的视频在时间上更加连贯流畅。 …

Python爬虫教程第1篇-基础知识

文章目录 什么是爬虫爬虫的工作原理用途搜索引擎爬虫Robots协议HTTP的请求过程URL的含义HTTP常见请求头爬虫常用的技术 什么是爬虫 信息的交互是通过web网页、或者移动端等不同的客户端端形式进行交互,这个过程是一个人与网路正常的交互行为。而爬虫可以用来模拟人…

二维树状数组区域查询

落谷4514 过关代码如下 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; //#define int long longconst int N 2050; int t1[N][N], t2[N][N], t3[N][N], t4[N][N]; int lowbit(int x) { return x & (-x); } int n, m; void update(…

将循环转化为递归的三种方法,求1+2+3……+n等差数列

解法一&#xff1a;使用公共变量s&#xff0c;递归循环1~n加到s上 #include<bits/stdc.h> using namespace std; int n,s; void fun(int i){if(i<n){ssi;fun(i1);}}int main(){cin>>n;fun(1);cout<<s;return 0; } 解法二&#xff1a;通过层层累加&#x…

Vue的民族民俗文化分享平台-计算机毕业设计源码22552

基于Vue的民族民俗文化分享平台设计与实现 摘 要 本文介绍了一种基于Vue.js前端框架和Express后端框架的民族民俗文化分享平台的设计和实现。该平台旨在通过线上方式&#xff0c;促进民族民俗文化的传播与分享&#xff0c;增强公众对多元文化的了解和认同。 平台为普通用户提供…

如何第一次从零上传项目到GitLab

嗨&#xff0c;我是兰若&#xff0c;今天想给大家说下&#xff0c;如何上传一个完整的项目到与LDAP集成的GitLab&#xff0c;也就是说这个项目之前是不在git上面的&#xff0c;这是第一次上传&#xff0c;这样上传上去之后&#xff0c;其他小伙伴就可以根据你这个项目的git地址…

L1218-L5298清零软件使用图解

清零前请取消打印任务&#xff0c;打印机用USB线接电脑并开启 双击[Resetter.exe]启动软件,点击[Select],选择Port打印机型号&#xff0c;然后点[OK]&#xff0c;如图。 [如果port下拉列表中找不到你的打印机&#xff0c;请更换USB接口&#xff0c;并重新开打印机重试。] 2.…

C语言自定义类型——联合体、枚举

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、联合体&#xff08;一&#xff09;、联合体的声明&#xff08;二&#xff09;、联合体的特点&#xff08;三&#xff09;、联合体大小的计算&#xff01;&a…

在本地运行React集成TypeScript的项目

首先问ChatGPT&#xff0c;贴一段TypeScript代码&#xff0c;问ChatGPT&#xff1a;要运行以上代码&#xff0c;该怎么操作&#xff1f; ChatGPT给出了详细步骤&#xff0c;下面是实际操作&#xff1a; 创建一个react项目&#xff1a; npx create-react-app yuanyu-timeline …