5. C++类的封装

news2024/11/26 4:24:20

一、类的封装

  1. 封装的含义:
    • 所有属性都是私有的,外部不能直接访问
    • 提供与属性相关的成员函数,间接访问属性

模板代码:

#include <iostream>
using namespace std;

class Clock {
private:
    int hour, minute, second;
public:
    Clock();							  // 声明无参构造函数,用缺省值初始化对象
    Clock(int newH, int newM, int newS);	// 声明有参构造函数,用传入的参数初始化对象
    
    // 内联函数,设置属性的值
    void setHour(int hour) {
        this->hour = hour;	// 将外部传入的值赋给属性
    }
    void setMinute(int minute) {
        this->minute = minute;
    }
    void setSecond(int second) {
        this->second = second;
    }
    // 获得属性的值
    int getHour() {
        return hour;
    }
    int getMinute() {
        return minute;
    }
    int getSecond() {
        return second;
    }
    
    void display() {
        cout << hour << ":" << minute << ":" << second << endl;
    }
};

// 定义无参构造函数,给hour、minute、second赋初值为1
Clock::Clock(): hour(1), minute(1), second(1) {  
}
/* 推荐写法:
Clock::Clock() {
    this->hour = 1;
    this->minute = 1;
    this->second = 1;
}
*/ 

// 定义有参构造函数,给hour、minute、second赋初值为传入的参数值
Clock::Clock(int newH, int newM, int newS): hour(newH), minute(newM), second(newS) { 
}
/* 推荐写法:
Clock::Clock(int newH, int newM, int newS) {
    this->hour = newH;		// 将传入的hour值赋给hour属性
    this->minute = newM;
    this->second = newS;
}
*/ 

int main() {
    
    Clock myClock1;		// 定义对象,此时自动调用无参构造函数
    cout << "利用无参构造函数创建的时间对象为:";
    myClock1.display();
    
    Clock myClock2(8, 3, 30);	// 定义对象,此时自动调用有参构造函数
    cout << "利用有参构造函数创建的时间对象为:";
    myClock2.display();
    
    myClock2.setHour(21);
    cout << "修改过的对象的时间为:";
    myClock2.display();    
    
    return 0;
}

二、数据域封装

2.1 数据封装的方法

  • 在定义私有数据域的类之外,对象不能通过直接引用访问该数据域

    // 这两种方式均错误
    myClock.hour = 5;
    hour = myClock.hour;
    
  • 为了能够访问私有数据域,可以编写一个成员函数返回数据值(如getHour,getMinute),为了能够修改它,可以编写一个成员函数(如setHour,setMinute)进行设置

    myClock.setHour(5);
    hour = myClock.getHour();
    

2.2 数据封装的优点

2.2.1 防止对封装数据的越权访问

  • 如果要隐藏studentID域,实现数据域的保护的方法有:
    • 用private声明这个数据
    • 不要定义getStudentID函数
class Student {
private:
    char studentID[20];
    char studentName[20];
    ......
}

2.2.2 限制私有特性改变时产生的连锁反应

  • 属性是私有的,不对外公开,必须要通过getAge函数去读取私有属性(age)的内容
  • 一个信息被隐藏的越好,未来可被修改的权利就更大
// 修改前的代码
class Student {
// 定义了age属性
private:
    int age;
public:
    int getAge(){
        return age;
    }
    ...
}

// 修改后的代码
// 把age属性替换成出生年、月、日
class Student {
private:
    int birthYear;
    int birthMonth;
    int birthDate;
public:
    int getAge(){
        age = 系统时间 - 出生年、月、日
        return age;
    }
    ...
}

// 调用代码
// 修改前后调用代码不需要改变
Student s;
int currentAge = s.getAge();
image-20220606210321109

2.2.3 保持数据的完整性

/* 
birthdate是私有属性
外界可以修改birthdate,但是数据的格式必须要符合要求,比如mm/dd/yyyy这种,因此可定义一个共有的检查函数updateBirthdate()
先对传过来的新修改的birthdate值进行格式检查,只有当格式符合要求的时候才可以调用私有成员函数setBirthdate()对birthdate进行修改
*/
class Student {
private:
    char birthdate[12];
    void setBirthdate(char d[]) {
        strcpy(birthdate, d);
    }
public:
    bool updateBirthdate(char d[]) {
        if(Data format is not mm/dd/yyyy)
            return false;
        else if(range of mm or dd is wrong)
            return false;
        else{
            setBirthdate(d);
            return true;
        }
    }
};
image-20220606211500694

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

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

相关文章

《UNIX 传奇:历史与回忆》读后感

《UNIX 传奇&#xff1a;历史与回忆》 是 bwk&#xff08;Brian W. Kernighan&#xff09;2019 年的新作&#xff0c;回忆了 UNIX 在大半个世纪的风雨历程&#xff0c;是一本引人入胜的书籍。通过对 UNIX 操作系统的历史和发展进行详细的叙述和回顾&#xff0c;让我对这个操作系…

浅析基于安防监控EasyCVR视频汇聚融合技术的运输管理系统

一、项目背景 近年来&#xff0c;随着物流行业迅速发展&#xff0c;物流运输费用高、运输过程不透明、货损货差率高、供应链协同能力差等问题不断涌现&#xff0c;严重影响了物流作业效率&#xff0c;市场对于运输管理数字化需求愈发迫切。当前运输行业存在的难题如下&#xf…

Java volatile关键字分析

每个线程创建时&#xff0c;JVM会为其创建一份私有的工作内存&#xff08;栈空间&#xff09;&#xff0c;不同线程的工作内存之间不能直接互相访问 JMM规定所有的变量都存在主内存&#xff0c;主内存是共享内存区域&#xff0c;所有线程都可以访问 线程对变量进行读写&#xf…

计算机组成原理-笔记-第三章

目录 计算机组成原理——第三章——存储系统 1、基本概念 &#xff08;1&#xff09;分类 &#xff08;2&#xff09;总结 2、主存储器&#xff08;基本原理&#xff09; &#xff08;1&#xff09;译码器、控制电路、存储单元 &#xff08;容量计算&#xff09; &…

匈牙利算法详解

匈牙利算法(Hungarian Algorithm)是一种组合优化算法(combinatorial optimization algorithm)&#xff0c;用于求解指派问题(assignment problem)&#xff0c;算法时间复杂度为O(N^3)。Harold Kuhn发表于1955年&#xff0c;由于该算法基于两位匈牙利数学家的早期研究成果&#…

数字IC流片经历有多重要?怎样才能有流片机会?

都说拥有流片经验可以显示你在实际项目中的实践能力和对整个设计流程的了解程度&#xff0c;流片经历的重要性不言而喻。 什么是芯片流片 像流水线一样通过一系列工艺步骤制造芯片&#xff0c;这就是流片。在芯片制造过程中一般有两段时间可以叫作流片。 流片&#xff1a;英…

分布式测试插件 pytest-xdist 使用详解

目录 使用背景&#xff1a; 使用前提&#xff1a; 使用快速入门&#xff1a; 使用小结&#xff1a; 使用背景&#xff1a; 大型测试套件&#xff1a;当你的测试套件非常庞大&#xff0c;包含了大量的测试用例时&#xff0c;pytest-xdist可以通过并行执行来加速整体的测试过…

Unity数字可视化学校_昼夜(二)

1、时间设置&#xff1a; 2、新建夜晚 3、新建侧置球&#xff08;BOX&#xff09;,测试灯光强度 降低亮度 色调&#xff1a;冷色调 4、自发光 新建shader 灯光控制 道路线&#xff1a; 建筑&#xff1a; 夜晚加灯光&#xff1a; 玻璃&#xff1a; 加大灯光数量&#xff1a; 边缘…

深入理解负载均衡原理及算法

1. 前言 在互联网早期,网络还不是很发达,上网用户少,流量相对较小,系统架构以单体架构为主。但如今在互联网发达的今天,流量请求动辄百亿、甚至上千亿,单台服务器或者实例已完全不能满足需求,这就有了集群。不论是为了实现高可用还是高性能,都需要用到多台机器来扩展服…

校对软件助力司法公正:确保法律文书准确无误

校对软件在司法系统中的应用可以助力司法公正&#xff0c;确保法律文书的准确性和无误性。以下是校对软件如何发挥作用&#xff1a; 1.确保准确性&#xff1a;校对软件可以自动检查法律文书中的语法、拼写和标点等方面的错误。通过及时发现和修正这些错误&#xff0c;可以确保文…

自监督去噪:Recorrupted-to-Recorrupted原理分析与总结

文章目录 1. 方法原理1.1 相关研究1.2 研究思路1.3 小结 2. 实验结果3. 总结 文章地址: https://ieeexplore.ieee.org/document/9577798/footnotes#footnotes 参考博客: https://github.com/PangTongyao/Recorrupted-to-Recorrupted-Unsupervised-Deep-Learning-for-Image-Den…

C++如何改变文字的颜色(不同字显示不同颜色)

许多同学们在制作c游戏的时候只有黑白两种颜色。就像si人了一样 非常影响视觉效果&#xff0c;显得十分不好看&#xff0c;因此&#xff0c;我决定发一个改变文字颜色的文章&#xff01; 下面介绍方法&#xff1a; 在了解程序之前&#xff0c;首先好了解光的三原色已经三原色…

数据结构刷题训练——链表篇(三)

目录 文章目录 前言 1. 题目一&#xff1a;环形链表Ⅱ 1.1 思路 1.2 分析 1.3 题解 1.4 方法二 2. 题目二&#xff1a;复制带随机指针的链表 2.1 思路 2.2 分析 2.3 题解 总结 前言 在这个专栏博客中&#xff0c;我们将提供丰富的题目资源和解题思路&#xff0c;帮助读者逐步提…

浅谈智能配电房在海岛中的应用

安科瑞 华楠 摘要&#xff1a;以海陵岛旅游区海岛智能配电房设计方案为研究对象,从功能设计、逻辑设计和拓扑设计三方面进行 分析,得出契合海陵岛实际和海岛特点的智能配电房方案设计。通过对设计方案研究,总结提炼了海岛智 能配电房组成要素,为进一步提炼统一规范的智能配电房…

【深度学习】【风格迁移】Zero-shot Image-to-Image Translation

论文&#xff1a;https://arxiv.org/abs/2302.03027 代码&#xff1a;https://github.com/pix2pixzero/pix2pix-zero/tree/main 文章目录 Abstract1. Introduction相关工作3. Method Abstract 大规模文本到图像生成模型展示了它们合成多样且高质量图像的显著能力。然而&#x…

【网络编程】实现一个简单多线程版本TCP服务器(附源码)

TCP多线程 &#x1f335;预备知识&#x1f384; Accept函数&#x1f332;字节序转换函数&#x1f333;listen函数 &#x1f334;代码&#x1f331;Log.hpp&#x1f33f;Makefile☘️TCPClient.cc&#x1f340;TCPServer.cc&#x1f38d; util.hpp &#x1f335;预备知识 &…

未来C#上位机软件发展趋势

C#上位机软件迎来新的发展机遇。随着工业自动化的快速发展&#xff0c;C#作为一种流行的编程语言在上位机软件领域发挥着重要作用。未来&#xff0c;C#上位机软件可能会朝着以下几个方向发展&#xff1a; 1.智能化&#xff1a;随着人工智能技术的不断演进&#xff0c;C#上位机…

数据结构--最小生成树

数据结构–最小生成树 连通图 \color{red}连通图 连通图的生成树是 包含图中全部顶点的一个极小连通子图 \color{red}包含图中全部顶点的一个极小连通子图 包含图中全部顶点的一个极小连通子图。 若图中顶点数为n&#xff0c;则它的生成树含有 n-1 条边。对生成树而言&#xff…

RFID技术助力半导体制造行业自动化生产

由于芯片短缺问题和近2年海运拥堵和成本上升等因素&#xff0c;致使全球资本对于芯片制造工厂的投入增大&#xff0c;而中兴、华为的例子已经凸显出国产半导体供应链的重要性&#xff0c;除去地缘政治上的意义&#xff0c;发展半导体其实是中国经济的转型的必走之路。 半导体生…

Vue2(生命周期,列表排序,计算属性和监听器)

目录 前言一&#xff0c;生命周期1.1&#xff0c;生命周期函数简介1.2&#xff0c;Vue的初始化流程1.3,Vue的更新流程1.4&#xff0c; Vue的销毁流程1.5&#xff0c; 回顾生命周期1.,6&#xff0c;代码演示1.6-1&#xff0c;beforeCreate1.6-2&#xff0c;created1.6-3&#xf…