《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的对象,函数定义时要在函数名后面加上const
	land.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_val
        return s;
    else
        return *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++)
        // 使用指针的方法返回一个对象,然后再取地址赋给top
        top = &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就替换成10
		Item items[MAX];
		int top; // 栈顶的指针
	public:
		Stack();
		bool isempty() const; // 栈是否为空
		bool isfull() const; // 栈是否满了
		bool push(Item &item); // 入栈,成功返回1,失败返回0
		bool 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;
				else
					st.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;
	}
	else
		return false;
}

bool Stack::pop(Item &item) {
	if (top > 0) {
		item = items[--top]; // 先减减,再操作
		return true;
	}
	else
		return false;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jsp生成验证码的代码

效果图&#xff1a; loginProcess.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><% String captcharequest.getParameter("captcha");%><% String captcha_session(String)s…

新手如何购买保险,保险投资基础入门

一、教程描述 本套保险教程&#xff0c;大小2.63G&#xff0c;共有11个文件。 二、教程目录 第01课 保险到底有什么用.mp4 第02课 已有社保还需要商业保险吗.mp4 第03课 你必须要懂的保险基础知识.mp4 第04课 关于重疾你必须要知道的几件事情.mp4 第05课 家庭重疾险如何…

Python 安装mysqlclient 错误 无法打开包括文件: “mysql.h”: 解决方法

解决方案&#xff1a;python最新3.12.0不支持mysqlclient 请下载 python3.9.9 版本 高速下载地址CNPM Binaries Mirror 官方下载地址Welcome to Python.org 下载完成后将python添加到环境变量 pycharm 虚拟环境下的python版本切换到你刚才下载的3.9.9的python版本 Avai…

SpringBoot事务处理

一、事务回顾 回顾地址&#xff1a; 深入理解数据库事务&#xff08;超详细&#xff09;_数据库事务操作_Maiko Star的博客-CSDN博客 事务&#xff1a; 是一组操作的集合&#xff0c;是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 事…

【数据分享】我国12.5米分辨率的坡向数据(免费获取)

地形数据&#xff0c;也叫DEM数据&#xff0c;是我们在各项研究中最常使用的数据之一。之前我们分享过源于NASA地球科学数据网站发布的12.5米分辨率DEM地形数据&#xff01;基于该数据我们处理得到12.5米分辨率的坡度数据、12.5米分辨率的山体阴影数据&#xff08;均可查看之前…

MySQL 8 手动安装后无法启动的问题解决

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

LeetCode:1457. 二叉树中的伪回文路径(DFS C++ Java)

目录 1457. 二叉树中的伪回文路径 题目描述&#xff1a; 原理思路&#xff1a; 1457. 二叉树中的伪回文路径 题目描述&#xff1a; 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的…

基于单片机DHT11湿度测量与控制-CO2-光照报警系统程序和仿真

一、系统方案 1、本设计采用这51单片机作为主控器。 2、DHT11温湿度、CO2、光照强度送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********************************…

初始化GPIO流程 以及点亮LED

点亮LED 需要单片机上的GIPIO端口引脚 输出对应的电压来对LED进行点亮 &#xff0c;关于GPIO的初始化流程其实我们只需要牢牢记住这张图即可 具体参考&#xff1a; https://blog.csdn.net/k666499436/article/details/123971479 1. GPIO的初始化 流程 使能时钟 在stm32中&…

51单片机蜂鸣器发出悦耳的声音

51单片机蜂鸣器发出悦耳的声音 1.概述 这篇文章介绍单片机控制蜂鸣器入门小实验&#xff0c;通过该实验掌握蜂鸣器发声的原理&#xff0c;控制声音发出我们想听的音乐。 2.蜂鸣器发声 2.1.硬件原理 1.蜂鸣器正极接单片机20号引脚VCC&#xff0c;负极接19号引脚P1.7 2.20MH…

从微软Cosmos DB浅谈一致性模型

最近回顾了微软的Cosmos DB的提供一致性级别&#xff0c;重新整理下一致性模型的相关内容。 0. Cosmos DB Cosmos DB&#xff08;Azure Cosmos DB&#xff09;是由微软推出的一个支持多模型、多 API 的全球分布式数据库服务。它旨在提供高度可扩展性、低延迟、强一致性和全球…

Java作业四

要求&#xff1a;编写带图形界面的聊天程序&#xff0c;实现让客户可以持续地发送消息给服务器&#xff0c;服务器也可以即时看到客户端发送的消息&#xff0c;并回消息给客户端。 程序运行界面如下&#xff1a; 老师写的&#xff1a; 1、客户端 package Demo02; import java.…

Redis面试题:Redis的数据过期策略有哪些?

目录 面试官&#xff1a;Redis的数据过期策略有哪些 ? 惰性删除 定期删除 面试官&#xff1a;Redis的数据过期策略有哪些 ? 候选人&#xff1a; 嗯~&#xff0c;在redis中提供了两种数据过期删除策略 第一种是惰性删除&#xff0c;在设置该key过期时间后&#xff0c;我们…

避免客户开发信被限制的方法与策略

开发信是外贸或者出海企业常用的一种开发客户的方式。相较于其他的获客方式&#xff0c;开发信能够更加精准地投放到客户中&#xff0c;并且只需承担较低的成本。但是&#xff0c;由于一些限制管制要求&#xff0c;外贸人员可能会遇到开发新被限制的情况。今天&#xff0c;小编…

五大自动化测试的 Python 框架

1、Selenium: Selenium 是一个广泛使用的自动化测试框架&#xff0c;用于测试Web应用程序。它支持多种浏览器&#xff0c;并通过模拟用户在浏览器中的操作来进行测试。Selenium 的 Python 客户端库是 Selenium WebDriver&#xff0c;它提供了一组API来编写测试脚本&#xff0c…

SpringBoot校验List失效解决方法

文章目录 SpringBoot校验List失效解决方法附&#xff1a;校验基本数据类型和String类型的方法参数时也需要在类上加Validated SpringBoot校验List失效解决方法 失效场景示例代码&#xff1a; RestController RequestMapping("/v1/jx/flowSummary") Slf4j public cl…

【Hadoop】分布式文件系统 HDFS

目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS &#xff08;Hadoop Distribute…

itop4412移植lrzsz工具踩坑笔记

4412开发板在传输文件一直用的都是tftp文件传输&#xff0c;但这样效率有点慢&#xff0c;平常在linux上习惯用lrzsz工具来传输文件&#xff0c;特此记录下&#xff0c;因为不熟悉linux编译 踩坑了很多地方 在操作前 我们的虚拟机要线安装好编译环境 下载lrzsz源码&#xff0…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多&#xff0c;整理起来繁琐而感到烦恼&#xff1f;是否曾经为了新建文件夹而手动一个一个进行创建&#xff0c;费时又费力&#xff1f;现在&#xff0c;我们的智能文件管理工具将为你解决这些问题&#xff01; 首先第一步&#xff0c;我们要进入文件…

整顿国产剧流水线“村花”?给三次元一点小小的美女震撼!

演员部分不符合角色的形象就用配角来补充说明&#xff0c;在国产剧里&#xff0c;短时间出现了两次。 演员的美从直观的肉眼可见&#xff0c;变成了配角用台词传达的结果。 &#xff08;图&#xff1a;宁安如梦&#xff09; 就像《以爱为营》里&#xff0c;女主的闺蜜随口就是…