第10章 对象和类

news2024/12/24 9:41:17

第10章 对象和类

  • 10.1 过程性编程和面相对象编程
  • 10.2 抽象和类
    • 10.2.1 类型是什么
    • 10.2.2 C++中的类
    • 10.2.3 实现类成员函数
    • 10.2.4 使用类

10.1 过程性编程和面相对象编程

采用OOP方法时,首先从用户的角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序。

10.2 抽象和类

将问题的本质特征抽象出来,并根据特征来描述解决方案。
抽象是通往用户定义类型的捷径。在C++中,用户定义类型指的是实现抽象接口的类设计。

10.2.1 类型是什么

指定基本类型完成了三项工作:
(1)决定数据对象需要的内存数量
(2)决定如何解释内存中的位(long和float在内存中占用的位数相同,但将它们转换为数值的方法不同)
(3)决定可使用数据对象执行的操作或方法
对于内置类型来说,有关操作的信息被内置到编译器中。但在C++中定义用户自定义的类型时,必须自己提供这些信息。

10.2.2 C++中的类

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
类规范由两个部分组成:
(1)类声明:以数据成员的方式描述数据部分,以成员函数(被称为方法)的方式描述公有接口
(2)类方法定义:描述如何实现类成员函数
通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。

// 程序清单10.1 stock00.h--Stock class interface
#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>

class Stock
{
    private:
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot()
        {

            total_val = shares * share_val;
        }

    public:
        void acquire(const std::string & co, long n, double pr);
        void buy(long num, double price);
        void sell(long num, double price);
        void update(double price);
        void show();
};

#endif

一、访问控制
访问控制关键字:private、public、protected,它们描述了对类成员的访问控制。
使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有成员。防止程序直接访问数据被称为数据隐藏。
在这里插入图片描述
类设计尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为封装。
封装的例子:
(1)数据隐藏是一种封装,将实现的细节隐藏在私有部分中
(2)将类函数定义和类声明放在不同的文件中
二、控制对成员的访问:公有还是私有
无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它。但由于隐藏数据是OOP主要的目标之一,因此数据项通常放在私有部分,组成类接口的成员函数放在公有部分;也可以把成员函数放在私有部分中,不能直接从程序中调用这种函数,但公有方法可以使用它们。通常,程序员使用私有成员函数来处理不属于公有接口的实现细节。
结构的默认访问类型是public,类的默认访问类型是private。

10.2.3 实现类成员函数

(1)定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类,类方法的完整名称中包括类名。
(2)类方法可以访问类的private组件。

// 程序清单10.2 stock00.cpp--implementing the Stock class
#include <iostream>
#include "stock00.h"

// Stock::acquire()是函数的限定名
// acquire()是全名的缩写,非限定名,只能在类作用域中使用
void Stock::acquire(const std::string & co, long n, double pr)
{
    company = co;
    if (n < 0) {
        std::cout << "Number of shares can't be negative; " << company << " shares set to 0." << std::endl;
        shares = 0;
    } else {
        shares = n;
    }
    share_val = pr;
    set_tot();
}

void Stock::buy(long num, double price)
{
    if (num < 0) {
        std::cout << "Number of shares purchased can't be negative. Transaction is aborted." << std::endl;
    } else {
        shares += num;
        share_val = price;
        set_tot();
    }
}

void Stock::sell(long num, double price)
{
    if (num < 0) {
        std::cout << "Number of shares sold can't be negative. Transaction is aborted." << std::endl;
    } else if (num > shares) {
        std::cout << "You can't sell more than you have! Transaction is aborted." << std::endl;
    } else {
        shares -= num;
        share_val = price;
        set_tot();
    }
}

void Stock::update(double price)
{
    share_val = price;
    set_tot();
}

void Stock::show()
{
    std::cout << "Company: " << company << std::endl;
    std::cout << "Shares: " << shares << std::endl; 
    std::cout << "Share Price: $" << share_val << std::endl;
    std::cout << "Total Worth: $" << total_val << std::endl;
}

一、成员函数说明
二、内联方法
其定义位于类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数。也可以在类声明之外定义成员函数,并使其成为内联函数。为此,只需在类实现部分中定义函数时使用inline限定符即可。内联函数的特殊规则要求在每个使用它们的文件中都对其进行定义。确保内联定义对多文件程序中的所有文件都可用的最简单的方法是:将内联定义放在定义类的头文件中。

class Stock
{
private:
	void set_tot();	
};
inline void Stock::set_tot()
{
	total_val = shares * share_val;
}

三、方法使用哪个对象
调用成员函数时,它将使用被用来调用它的对象的数据成员。
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
在这里插入图片描述

10.2.4 使用类

// 程序清单10.3 usestock0.cpp--the client program
#include <iostream>
#include "stock00.h"

int main(void)
{
    Stock fluffy_the_cat;
    fluffy_the_cat.acquire("NanoSmart", 20, 12.5);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(15, 18.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(400, 20.00);
    fluffy_the_cat.show();
    fluffy_the_cat.buy(300000, 40.125);
    fluffy_the_cat.show();
    fluffy_the_cat.sell(300000, 0.125);
    fluffy_the_cat.show();

    return 0;
}

在这里插入图片描述

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

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

相关文章

【蓝桥刷题】备战国赛——异或三角

蓝桥杯2021国赛真题——异或三角 &#x1f680; 每日一题&#xff0c;冲刺国赛 &#x1f680; 题目导航&#xff1a; 异或三角 &#x1f387;思路&#xff1a;数位 d p dp dp d f s dfs dfs 思维 &#x1f531;思路分析&#xff1a; ✅数理基础&#xff1a; 按位异或&am…

(2017,AdaIN)用自适应实例归一化进行实时的任意风格迁移

Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization 公众号&#xff1a;EDPJ 目录 ​​​​​​​0. 摘要 1. 简介 2. 相关工作 3. 背景 3.1 批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09; 3.2 实例归一化&#xff…

入驻京东直播间、成功借壳上市,交个朋友和时间“交朋友”

交个朋友一直走在“交朋友”的路上。 5月31日晚&#xff0c;交个朋友正式入驻京东直播间&#xff0c;首播销售额超1.5亿元&#xff0c;直播热度榜达人榜第一名&#xff0c;累计访问人次超1700万。据了解&#xff0c;京东618期间&#xff0c;除了日常直播外&#xff0c;交个朋友…

java并发编程:可见性、原子性、有序性三大特性详解

文章目录 可见性导致可见性的原因线程交叉执行重排序结合线程交叉执行共享变量更新后没有及时更新 如何解决可见性问题 原子性出现原子性问题的原因如何解决原子性问题 有序性导致有序性的原因如何解决有序性问题 总结 可见性 内存可见性&#xff0c;指的是线程之间的可见性&am…

IPv6NAT-PT实验:IPv4和IPv6地址转换的配置和验证

IPv6NAT-PT实验&#xff1a;IPv4和IPv6地址转换的配置和验证 【实验目的】 熟悉IPv6NAT-PT的概念。 掌握静态IPv6NAT-PT的配置 掌握动态IPv6NAT-PT的配置。 验证配置。 【实验拓扑】 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/0 192.168.12…

2023HW护网红队必备工具总结

一、信息收集 1、AppInfoScanner 一款适用于以HVV行动/红队/渗透测试团队为场景的移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具&#xff0c;可以帮助渗透测试工程师、红队成员快速收集到移动端或者静态WEB站点中关键的资产信息并提供基本的信息输出,如&#xff…

Java设计模式—模板方法模式

前言&#xff1a;模板方法模式是模板模式的一个具体实现&#xff0c;它定义了一个抽象类&#xff0c;其中包含一个模板方法和若干个基本方法。其中模板方法定义了算法骨架&#xff0c;而基本方法则由子类来实现。因此&#xff0c;模板方法在定义算法的结构方面提供了支持&#…

springMvc 解决 multipart/form-data 方式提交请求 不能获取非文件类型参数的问题和指定springmvc获取静态资源路径

问题&#xff1a; RequestMapping(value "/test",method RequestMethod.POST)ResponseBodypublic String test(String name,String id,MultipartFile file){System.out.println(name);System.out.println(id);System.out.println(file.getOriginalFilename());ret…

onnx模型的修改与调试demo

主要参考&#xff1a; 模型部署入门教程&#xff08;五&#xff09;&#xff1a;ONNX 模型的修改与调试 第五章&#xff1a;ONNX 模型的修改与调试 使用netron 可视化模型 读写onnx 构造onnx 创建一个描述线性函数 output axb 的onnx模型。 需要两个节点&#xff0c;第一个…

造轮子--自己封装一个 start

背景 都说不要造轮子&#xff0c;但是青柠认为&#xff0c;有的时候&#xff0c;造个轮子&#xff0c;更有助于清楚详细的业务逻辑&#xff0c;所以咱也自己写一个轮子&#xff0c;搞个系统开发。大体思路就是先搭建基础框架&#xff0c;然后细写业务逻辑&#xff0c;会涵盖主…

图解HTTP书籍学习2

确保Web安全的HTTPS HTTP的缺点 ●通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听 ●不验证通信方的身份&#xff0c;因此有可能遭遇伪装 ●无法证明报文的完整性&#xff0c;所以有可能已遭篡改 加密处理防止被窃听 通信的加密 一种方式就是…

【React】类组件,JSX语法,JSX原理,传递参数,条件渲染,列表渲染

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 React使用组件&#xff08;类组件&#xff09;JSX语法书写规范JSX插入的内容JSX属性绑定JSX类绑…

前端基础(CSS)——css介绍 常用样式 案例—进化到Bootstrap——进化到Element-UI(未完待续)

目录 引出CSS相关1.css写在哪里&#xff1f;2.css的选择器【重要】&#xff08;1&#xff09;标签选择器---div{}&#xff08;2&#xff09;id选择器----#div01{}&#xff08;3&#xff09;类选择器---class"div01"&#xff0c;.dav01{}&#xff08;4&#xff09;后代…

saas产品私有化(一) 缓存中间件适配

一.背景 名词解释:私有化一般指的是在对客交付过程中,客户由于自身数据敏感,成本控制等原因要求交付乙方将售卖的服务利用现有甲方的硬件设备或者云服务进行服务的部署. 面向场景:一般特制的是saas化的云服务软件提供商的对特殊客群的场景.其中saas行业中比较起步和规模比较大的…

流氓软件篡改微软EDGE浏览器主页面的那些伎俩

微软的EDGE浏览器很好用&#xff0c;但也很容易被绑架&#xff0c;在网上下载各类免费软件&#xff0c;只要你安装完&#xff0c;十有八九就给你把主页改成某某导航了。尽管打开EDGE直接进入360、毒霸、好123等链接对上网影响也不大&#xff0c;打开这些导航页面后&#xff0c;…

IMX6ULL裸机篇之I2C实验主控代码说明二

一. I2C实验 I2C实验内容&#xff1a; 学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C&#xff0c;读取 AP3216C 的传感器数据。 I2C读写数据时序图&#xff1a; I2C写数据时序图如下&#xff1a; I2C读数据时序图如下&#xff1a; 二. I2C主控读写时序 1. 读数据与写数…

MMDetection学习记录(二)之配置文件

文件结构 config文件 在 config_base_ 文件夹下有 4 个基本组件类型&#xff0c;分别是&#xff1a;数据集(dataset)&#xff0c;模型(model)&#xff0c;训练策略(schedule)和运行时的默认设置(default runtime)。 命名风格 {model}_[model setting]_{backbone}_{neck}_[no…

微信小程序项目实例——密码管理器

今日推荐&#x1f481;‍♂️ 自疫情后武林广场的音乐喷泉再次开启⛲⛲⛲ 坐在最佳视角下观赏了一场久违的表演&#x1f386;&#x1f386;&#x1f386; &#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;&#x1f52e;往期优质项目实例&#x1f52e;&#x1f52e;&…

在三台Linux虚拟机上完成构建集群的前置准备

前言 从现在开始进入到实操阶段&#xff0c;将要在VMware软件中创建多台Linux虚拟机&#xff0c;并进行系统设置。 需要同学们拥有前置知识&#xff1a; VMware的使用经验&#xff0c;知道什么是虚拟机并在VMware中创建过Linux虚拟机&#xff08;CentOS系统&#xff09; 熟…

go语言学习——8

文章目录 文件操作打开文件文件读取写文件判读文件或文件夹是否存在拷贝文件统计文件字符命令行参数flag包解析命令行参数 文件操作 os.File封装所有文件相关操作&#xff0c;File是一个结构体 打开文件 package mainimport ("fmt""os" )func main() {file…