C++ 中的类及其调用

类是一种将抽象转换为用户定义类型的 C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
下面来看一个表示股票的类。

首先,必须考虑如何表示股票。可以将一股作为基本单元,定义一个表示一股股票的类。然而,这意味着需要 100 个对象才能表示 100 股,这不现实。相反,可以将某人当前持有的某种股票作为一个基本单元,数据表示中包含他持有的股票数量。一种比较现实的方法是,必须记录最初购买价格和购买日期(用于计算纳税)等内容。另外,还必须管理诸如如拆股等事件。首次定义类就考虑这么多因素有些困难,因此我们对其进行简化。具体地说,应该将可执行的操作限制为:

* 获得股票;
* 增持;
* 卖出股票;
* 更新股票价格;
* 显示关于所持股票的信息。

可以根据上述清单定义 stock类的公有接口。为支持该接口需要存储一些信息。我们再次进行简化。例如,不考虑过多的限制。我们将存储下面的信息:
        * 公司名称;
        * 所持股票的数量:
        * 每股的价格;
        * 股票总值。

接下来定义类。一般来说,类规范由两个部分组成。

    * 类声明:以数据成员的方式描述数据部分,以成员函数被称为方法的方式描述公有接口
    * 类方法定义:描述如何实现类成员函数。

简单地说,类声明提供了类的蓝图,而方法定义则提供了细节。


什么是接口?
接口是一个共享框架,供两个系统(如在计算机和打印机之间或者用户或计算机程序之间) 交互时使用;例如,用户可能是您,而程序可能是字处理器。使用字处理器时,您不能直接将脑子中想到的词传输到计算机内存中,而必须同程序提供的接口交互。您敲打键盘时,计算机将字符显示到屏幕上;您移动鼠标时,计算机移动屏幕上的光标;您无意间单击鼠标时,计算机对您输入的段落进行奇怪的处理。程序接口将您的意图转换为存储在计算机中的具体信息。


对于类,我们说公共接口。在这里,公众(public)是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。例如,要计算 string对象中包含多少个字符,您无需打开对象,而只需使用 string 类提供的 size()方法。类设计禁止公共用户直接访问类,但公众可以使用方法 size()。方法 size()是用户和 string 类对象之间的公共接口的组成部分。通常,方法 gtline()是istream 类的公共接口的组成部分,使用 cin 的程序不是直接与 cin对象内部交互来读取一行输入,而是使用 getline()。


如果希望更人性化,不要将使用类的程序视为公共用户,而将编写程序的人视为公共用户。然而,要使用某个类,必须了解其公共接口;要编写类,必须创建其公共接口。


为开发一个类并编写一个使用它的程序,需要完成多个步骤。这里将开发过程分成多个阶段,而不是一次性完成。通常,C++程序员将接口(类定义)放在头文件中,并将实现(类方法的代码)放在源代码文件中。这里采用这种典型做法。


先来看看类的通用的特性。首先,C++关键字 class指出这些代码定义了一个类设计。这种语法指出,Stock 是这个新类的类型名。该声明让我们能够声明 Stock 类型的变量——称为对象或实例。每个对象都表示一支股票。

例如,下面的声明创建两个 Stock 对象,它们分别名为 sally和 solly:

    Stock sally;
    Stock solly;

例如,sally对象可以表示Sally 持有的某公司股票
接下来,要存储的数据以类数据成员(如company 和 shares)的形式出现。例如,sally 的 company成员存储了公司名称,share 成员存储了 Sally 持有的股票数量,share_val 成员存储了每股的价格total_val 成员存储了股票总价格。同样,要执行的操作以类函数成员(方法,如 sell()和 update())的形式出现。成员函数可以就地定义(如 set_tot()),也可以用原型表示(如其他成员函数)。

其他成员函数的完整定义稍后将介绍,它们包含在实现文件中,但对于描述函数接口而言,原型足够了。将数据和方法组合成一个单元是类最吸引人的特性。有了这种设计,创建 Stock 对象时,将自动制定使用对象的规则。
istream和ostream类有成员函数,如get()和getline()而Stock类声明中的函数原型说明了成员函数是如何建立的。例如,头文件iostream将getline()的原型放在stream 类的声明中。

示例源码:

Stock.h

#pragma once
#ifndef STOCK_H_
#define  STOCK_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

Stock.cpp

#include "Stock.h"
#include <iostream>

void Stock::acquire(const std::string& co, long n, double pr)
{
	company = co;
	if (n < 0)
	{
		std::cout << "股票数量不能为负, 这里设置为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 << "股票价格不能为负,交易异常" << std::endl;
	}
	else
	{
		shares += num;
		share_val = price;
		set_tot();
	}
}
void Stock::sell(long num, double price)
{
	
	using std::cout;
	if (num < 0) {
		cout << "股票出售价格不能为负, 交易异常" << std::endl;
	}
	else if (num > shares)
	{
		cout << "你不能出售超过你拥有的数量的股票,交易异常" << 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 << std::endl;
	std::cout << "股票数量: " << shares << std::endl;
	std::cout << "股票价格: $ " << share_val << std::endl;
	std::cout << "总价值: $ " << total_val << std::endl;

}

main.cpp

// Len2024_0102_02.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Stock.h"
int main()
{
	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.0);
	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;
}

执行结果:

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WendyWJGu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值