《C++PrimePlus》第10章 对象和类

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

10.2 抽象和类

10.3 类的构造函数和析构函数

类的定义和使用(买卖股票)

头文件stock10.h

#ifndef  __STOCK00__H__
#define __STOCK00__H__#include <string>class Stock {
// pravate的内容只能通过public访问
private:std::string company; // 公司名字long shares; // 股票的数量double share_val; // 每只股票的价格double total_val; // 股票总价值void set_total() {total_val = shares * share_val;}; // 函数在类的声明中定义,将自动成为内联函数public:// 默认构造函数Stock();// 构造函数Stock(const std::string &co, long n = 0, double pr = 0.0);// 析构函数~Stock();// 买入股票:买入数量,买入价格void buy(long num, double price);// 卖出股票:卖出数量,卖出价格void sell(long num, double price);// 传递最新价格void update(double price);// 显示股票信息void show() const;
}; #endif // ! __STOCK00_H__

源代码usestock2.cpp

#include <iostream>
#include "stock10.h"int main() {using std::cout;cout << "Using constructors to create new objects\n";Stock stock1("NanoSmart", 12, 20.0); // 隐式调用stock1.show();Stock stock2 = Stock("Boffo Objects", 2, 2.0); // 显式调用stock2.show();cout << "Assigning stock1 to stock2:\n";stock2 = stock1; // 类的对象可以相互之间对拷cout << "Listing stock1 and stock2:\n";stock1.show();stock2.show();cout << "Using a constuctor to reset an Object\n";stock1 = Stock("Nifty Foods", 10, 50.0); // 创建临时变量再赋值cout << "Revised stock1:\n";stock1.show();cout << "Done\n";const Stock land = Stock{ "Klu Pro" };// show()函数要接收const的对象,函数定义时要在函数名后面加上constland.show();return 0;
}

源代码stock10.cpp

#include <iostream>
#include "stock10.h"Stock::Stock() {std::cout << "Default constructor called\n";company = "no name";shares = 0;share_val = 0.0;total_val = 0.0;
}Stock::Stock(const std::string &co, long n, double pr) {company = co;if (n < 0) {std::cout << "Number can't be negative, shares set to 0" << std::endl;shares = 0;}else shares = n;share_val = pr;set_total();
}Stock::~Stock() {std::cout << "Bye, " << company << "!\n";
}void Stock::buy(long num, double price) {if (num < 0) {std::cout << "Number can't be negative, transatcion failed." << std::endl;}else {shares += num;share_val = price;set_total();}
}void Stock::sell(long num, double price){if (num < 0) {std::cout << "Number can't be negative, transatcion failed." << std::endl;}else if (num > shares){std::cout << "Number is more than you have, transaction failed." << std::endl;}else {shares -= num;share_val = price;set_total();}
}void Stock::update(double price) {share_val = price;set_total();
}void Stock::show() const{ // 代表函数不会修改值,可以接收const的对象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;
}

10.4 This指针

This指针的使用(比较股票总值)

// 比较股票的总金额,并返回一个对象
// 第2个const:函数不会修改被显式访问的对象
// 第3个const:函数不会修改被隐式访问的对象
// 第1个const:函数会返回一个const Stock对象
const Stock & Stock::topval(const Stock & s) const{if (s.total_val > total_val) // total_val == this->total_valreturn s;elsereturn *this; // this是一个指针,要返回值需要取值运算符
}

10.5 对象数组

使用对象数组(找出总价值最大的股票)

int main(){Stock stocks[4] = {Stock("NanoSmart", 12, 20.0),Stock("Boffo Objects", 200, 2.0),Stock("Monolithic Obelisks", 130, 3.25),Stock("Fleep Enterprises", 60, 6.5)};std::cout << "Stock holdings:\n";int st;for (st = 0; st < 4; st++)stocks[st].show();const Stock * top = &stocks[0];for (st = 1; st < 4; st++)// 使用指针的方法返回一个对象,然后再取地址赋给toptop = &top->topval(stocks[st]);std::cout << "\nMost valuable holding:\n";top->show();return 0;
}

10.6 类作用域

10.7 抽象数据类型

使用类实现抽象数据类型(栈)

头文件stack.h

#ifndef  __STACK__H__
#define __STACK__H__typedef unsigned long Item; // 类型别名,如果需要放别的类型就改这里class Stack {private:enum {MAX = 10}; // 创建枚举类型,遇到MAX就替换成10Item items[MAX];int top; // 栈顶的指针public:Stack();bool isempty() const; // 栈是否为空bool isfull() const; // 栈是否满了bool push(Item &item); // 入栈,成功返回1,失败返回0bool pop(Item &item); // 出栈,成功返回1,失败返回0
}; #endif

源文件stacker.cpp

#include <iostream>
#include "stack.h"
using namespace std;int main() {char ch;unsigned long po;Stack st;cout << "Enter 'A' to push to stack\n";cout << "Enter 'P' to pop from stack\n";cout << "Enter 'Q' to quit\n";while (cin >> ch && ch != 'Q') {while (cin.get() != '\n') // 删除输入行中剩余部分continue;switch (ch) {case 'A':cout << "Enter a number:" << endl;cin >> po;if (st.isfull())cout << "Stack already full." << endl;elsest.push(po);break;case 'P':if (st.isempty())cout << "Stack is empty." << endl;else {st.pop(po);cout << po << " is poped." << endl;}break;}cout << "Enter 'A' to push to stack\n";cout << "Enter 'P' to pop from stack\n";cout << "Enter 'Q' to quit\n";}return 0;
}

源文件stack.cpp

#include "stack.h"Stack::Stack() {top = 0;
}bool Stack::isempty() const {return top == 0;
}bool Stack::isfull() const {return top == MAX;
}bool Stack::push(Item &item){if (top < MAX) {items[top++] = item; // 先操作,后加加return true;}elsereturn false;
}bool Stack::pop(Item &item) {if (top > 0) {item = items[--top]; // 先减减,再操作return true;}elsereturn false;
}

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

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

相关文章

js用到的算法

1.对象数组中&#xff0c;对象中有对象&#xff0c;数组根据对象中的对象打平 [{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 次级},{indexValueMap: { 68443: 0, 68457: 0 },rowName1: 固定收益类,rowName2: 交易类,rowName3: 中…

虚幻学习笔记—点击场景3D物体的两种处理方式

一、前言 本文使用的虚幻引擎为5.3.2&#xff0c;两种方式分别为&#xff1a;点击根物体和精准点击目标物体。 二、实现 2.1、玩家控制器中勾选鼠标点击事件&#xff1a;这一步很重要&#xff0c;如图2.1.1所示&#xff1a;在自定义玩家控制器中勾 图2.1.1 选该项&#xff0c…

nacos集群开箱搭建-linux版本搭建

原创/朱季谦 nacos是一款易于构建云原生应用的动态服务发现、配置管理和服务管理平台&#xff0c;简单而言&#xff0c;它可以实现类似zookeeper做注册中心的功能&#xff0c;也就是可以在springcloud领域替代Eureka、consul等角色&#xff0c;同时&#xff0c;还可以充当spri…

activiti工作流 定义 TaskListener 无效

使用activiti 5.22 想全局定义任务监听器&#xff0c;结果试了多次发现没有效果。 最后看了看activiti的相关源码发现&#xff0c;流程定义里边没有处理 TaskListener 相关的操作&#xff0c;发现TaskListener 处理是在Task里边处理的&#xff0c;所以把TaskListener 定义在Ta…

【ISP】噪声--sensor(2)

1.热噪声 也叫KT/C噪声&#xff0c;或者叫暗电流噪声。电子的热运动的导致&#xff0c;温度上升&#xff0c;噪声增大。 2.FPN固定模式噪声 由于每个像素点的元器件制造的会有偏差&#xff0c;也就是这些器件的工作参数相对理论值的漂移就构成一种固定模式噪声。 3.光子散粒噪…

Springboot+vue的客户关系管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的客户关系管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的客户关系管理系统&#xff0c;采用M&#xff08…

fastjson和jackson序列化的使用案例

简单记录一下一个fastjson框架和jackson进行序列化的使用案例&#xff1a; 原json字符串&#xff1a; “{“lockCount”:”{1:790,113:1,2:0,211:0,101:1328,118:8,137:0,301:0,302:0}“,“inventoryCount”:”{1:25062,113:2,2:10000,211:2,101:11034,118:9,137:40,301:903914…

Python实现定时任务的方案及其比较

目录 一、引言 二、基于time模块的定时任务 三、基于schedule库的定时任务 四、基于APScheduler库的定时任务 五、基于Celery库的定时任务 七、总结与比较 一、引言 在Python中&#xff0c;定时任务指的是在特定的时间间隔或者特定的时间点自动执行某些操作的任务。定时…

十大排序之冒泡排序与快速排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;冒泡排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现&#x1f387;4.代码优化&#xff08;添加标志量&#xff09; …

前端向后端传JSON数据,使用MyBatis查询

form中向后端传的是空字符串&#xff0c;并不是null 而在MyBatis的判断中应判断是否为空字符串&#xff0c;而并非null

【Rxjava详解】(四)线程切换

lift()变换原理 这些变换虽然功能各有不同&#xff0c;但实质上都是针对事件序列的处理和再发送。而在RxJava的内部&#xff0c;它们是基于同一个基础的变换方法&#xff1a;lift()。 首先看一下lift() 的内部实现&#xff08;仅显示了部分主要逻辑代码): public <R> …

盘点43个Android项目源码安卓爱好者不容错过

盘点43个Android项目源码安卓爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1yHmkUeX4vxVag9Yr0yeQRg?pwd8888 提取码&#xff1a;8888 项目名称 Android NDK直播项…

Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …

(附源码)springboot电影售票系统小程序 计算机毕设36991

目 录 摘要 1 绪论 1.1课题目的与意义 1.2研究背景 1.3论文结构与章节安排 1.4小程序框架以及目录结构介绍 2 springboot电影售票系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据…

Elasticsearch集群部署

服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.57centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示例节点&#xff1a;10.3.145…

Redis分布式锁实现Redisson 15问

在一个分布式系统中&#xff0c;由于涉及到多个实例同时对同一个资源加锁的问题&#xff0c;像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用&#xff0c;需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis…

文本编辑 UTF-8 BOM 中的BOM释义

参考资料 UTF8のBOM無しとBOM付きの違いBOMなしUTF-8によってWindowsでもたらされる困惑文字コードをUTF-8 BOMなし(UTF-8N)でファイル保存をする方法 目录 一. 前提二. BOM三. CSV文件中的表现 一. 前提 在使用Windows自带的记事本编辑.csv文件的时候&#xff0c;准备保存为…

Java 基础学习(一)Java环境搭建和基本数据类型

1 Java 开发环境搭建 1.1 Java 编程语言 1.1.1 什么是Java编程语言 语言是人类进行沟通交流的各种表达符号&#xff0c;方便人与人之间进行沟通与信息交换&#xff1b;而计算机编程语言则是人与计算机之间进行信息交流沟通的一种特殊语言&#xff0c;也有语法规则、字符、符…

kali linux英文改中文

如果英语基础较好的同学可以不用调整 反之则需要 找到终端&#xff08;就是输入命令的那个地方 如下&#xff09;点击它出现命令终端 切换为root用户&#xff0c;命令为&#xff1a; sudo dpkg-reconfigure locales 然后回车 找到这个zh_CN 然后回车 鼠标下键选中并且回车 输…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…