从C过渡到C++,类是一个新的概念。

类是由数据表示和操纵数据的方法组合成的一个包。

本文使用一个例子(Stock)来加深对类的理解。

使用C++类来表示一个物体,首先要考虑类需要包含的内容。

对于股票来说,需要包含的内容很多。

先考虑可以对股票进行的操作:获得股票;买入;卖出;更新股票价格;显示股票信息。

然后考虑股票需要存储的信息:公司名称;股票数量;每股价格;股票总值。

接下来定义类,

类有两部分,类声明(声明数据成员和成员函数)和类定义(实现成员函数)。

​//stock.h
class Stock   //类声明 class
{
private:    //私有成员 privatestd::string company; //公司名称,所持股票数量,每股价值,股票总值。long shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }
public:     //公有成员,外部接口 publicvoid 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()const;
};​
//stock.cpp stock类的具体实现#include<iostream>
#include"stock.h"void Stock::buy(long num, double price)
{if (num < 0){std::cout << "shares 买入不能为负。"<< "放弃操作。\n";}else{shares += num;share_val = price;set_tot();}
}
void Stock::sell(long num, double price)
{using std::cout;if (num < 0){cout << "售出shares不能为负。"<< "放弃售出操作。\n";}else if (num > shares){cout << "售出不能大于所有。"<< "放弃售出操作。\n";}else{shares -= num;share_val = price;set_tot();}
}
void Stock::update(double price)
{share_val = price;set_tot();
}
void Stock::show() const
{using std::cout;using std::ios_base;//此处为输出格式的设置,略看ios_base::fmtflags orig =cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "公司:" << company<< " 股份:" << shares << '\n'<< "每股价格: $" << share_val;cout.precision(2);cout << " 总值: $" << total_val << '\n';//恢复原来的设置,避免影响其他输出。cout.setf(orig, ios_base::floatfield);cout.precision(prec);
}

以上完成了对Stock类的初步定义。

接下来可以使用Stock类(使用多文件程序方法,将stock.cpp和stock.h放在主函数的同一工程内)

#include<iostream>
#include"stock.h"
int main()
{Stock fluffy_the_cat;fluffy_the_cat.acquire("NanoSmart", 20, 12.50);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.25);fluffy_the_cat.show();fluffy_the_cat.sell(300000, 0.125);fluffy_the_cat.show();system("pause");return 0;
}

至此,完成了Stock类的创建和使用。

但是,对于一个类,我们还有一些工作要做。提供构造函数和析构函数来完成类的创建和清理。

对于Stock类,也应提供构造函数和析构函数。

//stock.h  类的声明
#pragma once //防止头文件重复编译
#include<string>class Stock   //类声明 class
{
private:    //私有成员 privatestd::string company; //公司名称,所持股票数量,每股价值,股票总值。long shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }
public:     //公有成员,外部接口 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;
};
//stock20.cpp stock类的具体实现#include<iostream>
#include"stock.h"Stock::Stock()
{std::cout << "默认构造函数\n";company = "no name";shares = 0;share_val = 0.0;total_val = 0.0;
}Stock::Stock(const std::string & co, long n, double pr)
{std::cout << "构造函数使用 " << co << " 调用\n";company = co;if (n < 0){std::cout << "shares 不能为负; "<< company << ":shares 设置为0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();
}
Stock::~Stock()
{std::cout << "Bye, " << company << '!\n';
}void Stock::buy(long num, double price)
{if (num < 0){std::cout << "shares 买入不能为负。"<< "放弃操作。\n";}else{shares += num;share_val = price;set_tot();}
}
void Stock::sell(long num, double price)
{using std::cout;if (num < 0){cout << "售出shares不能为负。"<< "放弃售出操作。\n";}else if (num > shares){cout << "售出不能大于所有。"<< "放弃售出操作。\n";}else{shares -= num;share_val = price;set_tot();}
}
void Stock::update(double price)
{share_val = price;set_tot();
}
void Stock::show() const
{using std::cout;using std::ios_base;//此处为输出格式的设置,略看ios_base::fmtflags orig =cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "公司:" << company<< " 股份:" << shares << '\n'<< "每股价格: $" << share_val;cout.precision(2);cout << " 总值: $" << total_val << '\n';//恢复原来的设置,避免影响其他输出。cout.setf(orig, ios_base::floatfield);cout.precision(prec);
}

加上了构造函数和析构函数后,Stock类变得更完整了。

接下来还可以Stock进行一些完善,比如给类添加一些方法,等等。

另外,对类也有一些操作,比如创建类的数组,使用指针,获取类的地址等等。类与之前的基本数据类型有很多相同的操作。

//stock20.h  类的声明
#pragma once //防止头文件重复编译
#include<string>class Stock   //类声明 class
{
private:    //私有成员 privatestd::string company; //公司名称,所持股票数量,每股价值,股票总值。long shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }
public:     //公有成员,外部接口 publicStock();  //构造函数,名字与类名相同。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;const Stock & topval(const Stock& s)const;//用来比较两个类,隐式传递this指针(指向调用函数的类)
};
//stock20.cpp stock类的具体实现#include<iostream>
#include"stock20.h"Stock::Stock()
{std::cout << "默认构造函数\n";company = "no name";shares = 0;share_val = 0.0;total_val = 0.0;
}Stock::Stock(const std::string & co, long n, double pr)
{std::cout << "构造函数使用 " << co << " 调用\n";company = co;if (n < 0){std::cout << "shares 不能为负; "<< company << ":shares 设置为0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();
}
Stock::~Stock()
{std::cout << "Bye, " << company << '!\n';
}void Stock::buy(long num, double price)
{if (num < 0){std::cout << "shares 买入不能为负。"<< "放弃操作。\n";}else{shares += num;share_val = price;set_tot();}
}
void Stock::sell(long num, double price)
{using std::cout;if (num < 0){cout << "售出shares不能为负。"<< "放弃售出操作。\n";}else if (num > shares){cout << "售出不能大于所有。"<< "放弃售出操作。\n";}else{shares -= num;share_val = price;set_tot();}
}
void Stock::update(double price)
{share_val = price;set_tot();
}
void Stock::show() const
{using std::cout;using std::ios_base;//此处为输出格式的设置,略看ios_base::fmtflags orig =cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "公司:" << company<< " 股份:" << shares << '\n'<< "每股价格: $" << share_val;cout.precision(2);cout << " 总值: $" << total_val << '\n';//恢复原来的设置,避免影响其他输出。cout.setf(orig, ios_base::floatfield);cout.precision(prec);
}const Stock & Stock::topval(const Stock & s)const
{if (s.total_val > total_val)return s;elsereturn *this;
}
#include<iostream>
#include"stock20.h"const int STKS = 4;
int main()
{Stock stocks[STKS] ={Stock("NanoSmart",12,20.0),Stock("Boffo Objects",200,2.0),Stock("Monolithic Obelisks",130,3.25),Stock("Fleep Enter[rise",60,6.5)};std::cout << "持有股票:\n";for (int i = 0; i < STKS; i++){stocks[i].show();}const Stock *top = &stocks[0];for (int i = 1; i < STKS; i++){top = &top->topval(stocks[i]);}std::cout << "所持有的价值最高的是:\n";top->show();system("pause");return 0;
}

C++类的实例:Stock(股票)类。相关推荐

  1. Python元类和新型类-对象是类的实例,那类又是谁的实例?

    文章目录 元类 类工厂 初始元类 元类属性 元类作用 面向方面和元类 小结 新型类 新型类VS传统类 静态方法和类方法 特定方法 特定属性 super()方法 小结 元类 既然对象是以类为模板生成的, ...

  2. php实例类,php实例-对象与类

    name,"\tis",$this->gender,"\r\n" ; } } class family{ public $people; public $ ...

  3. 类的实例属性和类属性的区别

    类的属性类和实例都可以访问,实例的属性类不可以访问只有类能访问,他们的定义方式也不同: 类属性的定义: class A(objects): version=1.2             #类属性的定 ...

  4. python类继承实例_Python实现类继承实例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit ...

  5. Python学习:类与实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类 而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...

  6. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  7. python股票预测的意义是什么_股票预测python,python 设计一个名为Stock的类来表示...

    python 设计一个名为Stock的类来表示一个公司的股票? class Stock(): def __init__(self): self.__no = "" self.__n ...

  8. c++类与对象(多文件编程!)(编写一个有关股票的程序,其中有两个类:一个是深圳类shen_stock,另一个是上海类shang_stock。)

    #编写一个有关股票的程序,其中有两个类:一个是深圳类shen_stock,另一个是上海类shang_stock.类中有三项私有数据成员:普通股票个数general.ST股票个数st和PT股票个数pt, ...

  9. 6-1 设计一个股票类(高教社,《Python编程基础及应用》习题9-6)

    6-1 设计一个股票类(高教社,<Python编程基础及应用>习题9-6) (10 分) 设计一个名为Stock的类来表示一个公司的股票,包括以下内容: 1)股票代码.股票名称.前一天股票 ...

最新文章

  1. springMVC上传下载
  2. toughradius 配置mysql_ToughRADIUS
  3. 15 款Python编辑器的优缺点,别再问我“选什么编辑器”啦!
  4. 打架程序_学生打架不知道怎么处理?一般程序了解下,对你或许有帮助
  5. 绿盟科技鸿蒙系统,华为 X 绿盟科技,打造“云原生安全新生态”
  6. 先装vs还是先装sql_锅炉给水泵的止回阀到底安装在出口阀前还是阀后?
  7. windows 程序设计及API
  8. 【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
  9. 【vue开发问题-解决方法】(五)vue Element UI 日期选择器获取日期格式问题 t.getTime is not a function
  10. 【转】CentOS系统操作下安装相关各种软件
  11. 小米路由器安装Linux软件,小米路由器mini安装mixbox教程
  12. WPS表格填充技巧大全
  13. 使用YALMIP 求解LMI时遇到的问题
  14. 省市区areacode反查的精简写法
  15. iOS使用CNContact对通讯录增删改查
  16. 2019华为网络精英挑战赛参赛体验
  17. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数-数论
  18. 中国34个省市 按字母排序 uniapp城市列表
  19. 离线安装.Net Framework 3.5
  20. 抖音短视频获客系统源码开发及搭建分享

热门文章

  1. 凹凸世界8月23服务器维修,《凹凸世界》手游8月26日版本更新停服维护公告
  2. LNMP架构介绍及原理流程
  3. javascript当中嵌套函数
  4. 游戏3D建模师是一个什么样的职业
  5. linux磁盘空间查看与清理
  6. windows电脑如何删除服务
  7. ELK 收集 Java 后台日志
  8. 微软总部MVP峰会,西雅图现场报导
  9. 操作系统浏览器发音_linux-ubuntu 你读错了吗?
  10. Win11 桌面快捷方式未全部显示的诡异现象及解决方法