对象和类
过程性编程和面向对象编程
过程性编程:首先考虑要遵循的步骤,然后考虑如何让表示这些数据。面向对象编程:首先从用户的角度考虑对象,然后考虑接口和数据存储,最后使用新的设计方案创键出程序。
举个栗子
如果你是一位OOP程序员,你收到一个项目–设计一个程序表示股票。那么你作为一个资深OOP程序员,你的脑回路应该是这样的。
股票的种类那么多,怎么表示股票?我们可以用一个类表示股票的类型,每一种股票就是一个对象。作为一家公司老总,我们对股票有哪些操作?获得股票增持卖出股票更新股票价格显示股票信息实现这些操作后,股票要具备哪些数据?公司名称所持股票数量每股价格股票总价设计方案
总之,面向对象编程就是从用户的角度来出发,来设计程序。这里的用户可以是人,也可以是程序。
C++中的类
什么是类?类就是一种抽象的类型,就像上面的股票类型什么是对象?对象就是类中一个具体实例,就像上面的具体的一种股票。
如何定义类?
1类声明
//类1.h
#ifndef aa
#define aa
#include<iostream>
#include<string>
class Stoke
{
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
可以看出来这里有几个关键词class,private,public.class:用来声明类。private:类的私有部分public:类的公有部分数据项通常放在私有部分,接口的类成员函数通常放在公有部分将数据和方法组成一个单元是类最吸引人的特性。不管是公有部分,还是私有部分,成员可以是数据也可以是函数。数据隐藏是OOP的一种伟大思想,类划分了公有部分和私有部分,对象可以访问公有部分,不能直接访问私有部分,但是可以通过公有成员函数来访问私有部分。公有成员函数是用户和对象的私有数据沟通的桥梁,这也是我们所说的公有接口。只有在定义类的时候可以直接访问类的私有部分。
实际上,你如果C语言学的很好,你会发现,类和结构非常相似。
struct Stoke
{
std::string company;//公司名
long shares;//所持股票数量
double share_val;//每股价格
double total_val;//股票总价
void (*set_tot)()
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)();//显示信息
}
看看上面这段代码,我们使用结构体和函数指针就可以实现,股票结构体的数据和操作。当我们有一个结构对象a时,我们可以使用a.acqure来获得股票。所以说,将数据和方法组成一个单元并非类的专属。结构体无法区分公有部分和私有部分,所以说类是加强版的结构体
2类方法定义
//类1.cpp
#include<iostream>
#include"类1.h"
void Stoke::acquire(const std::string &co,long n,double pr)
{
company=co;
if(n<0)
{
std::cout<<"数量不能是负数"
<<company<<"的股票数量将设置成0
";
shares=0;
}
else
{
shares=n;
}
share_val=pr;
set_tot();
}
void Stoke::buy(long num,double price)
{
if(num<0)
{
std::cout<<"数量不能是负数。交易失败。
";
}
else
{
shares+=num;
share_val=price;
set_tot();
}
}
void Stoke::sell(long num,double price)
{
using std::cout;
if(num<0)
{
cout<<"数量不能是负数.
";
}
else if(num>shares)
{
cout<<"卖出数量大于持有数量。交易失败。
";
}
else
{
shares-=num;
share_val=price;
set_tot();
}
}
void Stoke::show()
{
using std::cout;
using std::endl;
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<<endl
<<"每股价格:$"<<share_val;
cout.precision(2);
cout<<" 总价值:$"<<total_val<<endl;
cout.setf(orig,ios_base::floatfield);
cout.precision(prec);
}
类方法定义就是实现类成员函数。成员函数的定义与常规函数的定义非常相似。但是成员函数的定义有3个特征:要使用作用域解析符::可以直接访问类的私有成员在类成员函数中,不必使用作用域解析符,就可以直接使用类成员数据和调用类成员函数。
内联方法
在类声明中,有一个私有成员函数set_tot,由于它是私有的,只有编写这个类的时候,可以调用它,而用户不能调用它,使用私有成员函数主要是省去一些重复代码的输入。除了这个特征以外,我们发现,set_tot函数,在声明的时候直接给出了定义。类声明常将短小的成员函数作为内联函数,所以这个函数实际上会被编译器变成内联函数。如果你不知道什么是内联函数,可以看看我写的这篇博客内联函数
方法使用哪个对象
实际上,每个对象都有它的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组类方法。
3使用类
//类1main.cpp
#include<iostream>
#include"类1.h"
int main()
{
Stoke x;
x.acquire("USTC",20,12.50);
x.show();
x.buy(15,18.125);
x.show();
x.sell(400,20.00);
x.show();
x.buy(300000,40.125);
x.show();
x.sell(300000,0.125);
x.show();
return 0;
}
PS D:studyc++path_to_c++> g++ -I .include .类1.cpp .类1main.cpp -o 类1
PS D:studyc++path_to_c++> .类1.exe
公司:USTC 股票数量:20
每股价格:$12.500 总价值:$250.00
公司:USTC 股票数量:35
每股价格:$18.125 总价值:$634.38
卖出数量大于持有数量。交易失败。
公司:USTC 股票数量:35
每股价格:$18.125 总价值:$634.38
公司:USTC 股票数量:300035
每股价格:$40.125 总价值:$12038904.38
公司:USTC 股票数量:35
每股价格:$0.125 总价值:$4.38
4小结
是提供类声明。类声明和结构声明相似,可以包括数据成员和函数成员。声明有私有部分,其中成员只能通过成员函数进行访问;声明有公有部分,其中成员可被直接用户直接访问。通常数据成员放在私有部分,成员函数放在公有部分。
class className
{
private:
数据成员
public:
函数成员
}
公有部分实际就是我们所说的公有接口。类具有数据隐藏、抽象、封装等OOP特性。
实现类成员函数。可以在类声明中提供完整的函数定义,也可以类声明中只提供函数原型,然后再写完整的函数定义。假设类Bozo有一个Retort成员函数,则其函数头应该是char*Bozo::Retort。注意这里的作用域解析符。
使用类,创建对象Bozoa;,调用其成员函数cout< 文章为作者独立观点,不代表 股票程序化软件自动交易接口观点