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

news2024/11/30 18:49:52

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;
}

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

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

相关文章

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

坚鹏:广州银行清华大学消费金融发展趋势与创新培训圆满结束

广州银行自1996年9月成立以来&#xff0c;依托中国经济腾飞的大好形势&#xff0c;成为国内具有一定知名度与地方特色的商业银行。截至2022年12月末&#xff0c;已开业机构174家&#xff0c;包括总行1家&#xff0c;分行级机构15家(含信用卡中心)、支行152家、信用卡分中心6家&…

STM32 外部中断配置与中断函数设计

单片机学习 目录 文章目录 一、外部中断配置步骤 1.1配置RCC 1.2配置GPIO 1.3配置AFIO 1.4配置EXTI 1.5配置NVIC 二、中断函数设计 总结 一、外部中断配置步骤 第一步&#xff1a;配置RCC&#xff0c;把涉及外设的时钟打开。第二步&#xff1a;配置GPIO&#xff0c;选择…

企业如何创建和运营在线知识库?

随着企业业务的不断扩展和复杂化&#xff0c;建立一个在线知识库已经成为企业提高效率、减少重复劳动和提升服务质量的重要手段。接下来就详细介绍一下企业如何创建和运营在线知识库。 | 一、明确知识库的需求和目标 在开始建立在线知识库之前&#xff0c;企业需要明确知识库的…

ClickHouse中的物化视图

技术主题 技术原理 物化视图&#xff08;Materialized View&#xff09;是一种预先计算并缓存结果的视图&#xff0c;存储在磁盘上自动更新&#xff0c;空间换时间的思路。物化视图是一种优化技术&#xff0c;本质上就是为了加速查询操作&#xff0c;降低系统负载&#xff0c…

操作系统——解决了我的一些困惑

目录 1、电脑开机做了什么事情 2、真正实现并行的计算机 3、计算机中的淘汰算法 & 分配算法 & 调度算法 & 空间管理 4、什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f;最多可分配多少&#xff1f; 5、TLB&#xff08;快表&#xff09;、分页存储&…

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名&#xff01;高级提示&#xff1a;使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…

佳易王幼儿园缴费系统软件编程应用实例

佳易王幼儿园缴费系统软件编程实例 佳易王幼儿园缴费系统功能&#xff1a; 1、系统设置 2、班级设置 3、其他费用名称 4、学生信息管理 5、学生缴费 6、统计报表 7、备份全部数据 软件试用版下载可以点击下方官网卡片

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

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

2016年五一杯数学建模B题能源总量控制下的城市工业企业协调发展问题解题全过程文档及程序

2016年五一杯数学建模 B题 能源总量控制下的城市工业企业协调发展问题 原题再现 能源是国民经济的重要物质基础,是工业企业发展的动力&#xff0c;但是过度的能源消耗&#xff0c;会破坏资源和环境&#xff0c;不利于经济的可持续发展。目前我国正处于经济转型的关键时期&…

String,StringBuffer以及StringBuilder之间的区别

文章目录 区别一&#xff1a;字符串内容是否可变区别二&#xff1a;线程安全区别三&#xff1a;性能区别四&#xff1a;使用场景 “String,StringBuffer以及StringBuilder之间的区别的区别” 这个问题是面试官比较常问的一个Java基础题。在日常的开发中&#xff0c;也常常会用到…

Vue轻松入门,附带学习笔记和相关案例

目录 一Vue基础 什么是Vue&#xff1f; 补充&#xff1a;mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式&#xff1f; 插值表达式的缺点 解决方法 相关代…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/165.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator &#xff08;MBG&#xff09; 是 MyBatis 的代码生成器。它能够根据数据库表&#xff0c;自动生成 java 实体类、dao 层接口&#xff08;mapper 接口&#xff09;及m…

OpenCV检测圆形东西是否存在缺口?

文章目录 前言一、试过的方法二、最终使用的方法1.先极坐标变换2.计算斜率 总结 前言 想了挺久&#xff0c;一直没解决这个问题。后面勉强解决了。 一、试过的方法 1.想用圆度来解决&#xff0c;后来发现圆度差值很小&#xff0c;完整的圆圆度0.89&#xff0c;然后有缺角的圆圆…

性能测试【二】:nmon的常用操作

性能测试【二】&#xff1a;nmon的常用操作 1、nmon介绍说明2、软件下载2.1、Nmon下载地址2.2、Nmonanalyser下载地址 3、nmon使用3.1、将nmon上传至/usr/local/src目录下&#xff0c;并解压3.2、解压后根据自己系统的实际版本查找相应的使用命令&#xff0c;并给命令赋予可执行…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web&#xff1a;路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

Yolov8训练自己的数据集过程

做自己第一次使用Yolov8的记录。 1、下载代码 官网的我没找到对应的视频教程&#xff0c;操作起来麻烦&#xff0c;一下这个链接的代码可以有对应bilibili教程&#xff1a;完整且详细的Yolov8复现训练自己的数据集 选择这个下载&#xff1a; 2、安装需要的包&#xff1a; 按…

2018年10月16日 Go生态洞察:App Engine新Go 1.11运行时发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

项目中启用Log4j2日志框架

在实际的项目开发中&#xff0c;日志十分重要&#xff0c;无论是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息&#xff0c;能帮助我们了解并监控系统状态&#xff0c;并在发生错误或者接近某种危险状态时能…