#ifndef STOCK00_H_
#define STOCK00_H_
//using namespace std;
#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
1:首先,可以将类的定义放在头文件中,另外,定义类时,设置了访问控制权限。访问类对象的程序都可以直接访问共有部分(public),但是,对于私有部分的访问,只能通过共有成员函数来访问,例如,修改shares的值时,只能用update函数来修改。(看起来是不是和结构类似,定义该类的对象时,也和结构类似,两者的区别是结构的实属性石public而类是private的)。
2:类设计尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为是一种封装,将实现的细节隐藏在私有部分,就想stock类对set_tot()所做的那样,也是一种封装。
3:定义对象和定义函数
定义类对象和结构的方法是一样的:Stock sally;
定义函数有两点特殊的地方:定义成员函数时,使用作用域解析运算符::来标识函数所属的类;类方法可以访问类的private。
void Stock::show();
这说明,类的对象可以访问,但其他对对象要访问,必须有特殊语句。也可以将这个成员函数在别的类中定义.
#include<iostream>
#include"stock00.h"
void Stock::acquire(const std::string &co,long n,double pr)
{
company = co;
if(n<0)
{
std::cout<<"Number of shares can't be negative;"<<company<<"shares set to 0.\n";
shares=0;
}
else
shares=n;
share_val=pr;
set_tot();
}
void Stock::buy(long num,double price)
{
using namespace std;
if(num<0)
{
cout<<"Number of shates purchased can't be negative."<<"Transaction is aborted"<<endl;
}
else
{
shares+=num;
share_val=price;
set_tot();
}
}
void Stock::sell(long num,double price)
{
using namespace std;
if(num<0)
{
cout<<"Number of sjares sold can't be negative."<<"Transaction is aborted."<<endl;
}
else if(num>shares)
{
cout<<"You can't sell more than you have!"<<"Transaction is aborted."<<endl;
}
else
{
shares-=num;
share_val=price;
set_tot();
}
}
void Stock::update(double price)
{
using namespace std;
share_val=price;
set_tot();
}
void Stock::show()
{
using namespace std;
cout<<"Company:"<<company<<endl;
cout<<"Shares:"<<shares<<endl;
cout<<"share price:$"<<share_val<<endl;
cout<<"total worth:$"<<total_val<<endl;
}
这是函数定义方法,其中,set_tot()是内联函数,可以讲其放在定义类的头文件中,否则就要在每个使用它的文件中定义一次4:构造函数构造函数的目的是用来给类对象初始化,这样就不用通过调用函数来给她初始化了。构造函数名和类名相同,没有返回值,且成员变量不能当做构造函数的参数。构造函数有两种形式:Stock food=Stock("wang",25,2.2);stock food("wang",25,2.2);另一种和new一起用的情况:Stock *pstock=new Stock("wang",3,2.2);这条语句创建一个对象,并初始化,并将该对象的地址赋给pstook指针,则对象没有名称,用指针管理。构造函数不能被对象调用,因为构造函数就是用来创建对象的。如果创建对象,没有构造函数,如上面函数,那么就会有默认值。但是,如果设置了构造函数,就必须赋值。这样做的原因,是想禁止创建没初始化的对象。另外,一个对象可以赋给同类型的另一个对象:stock1=stock2;也可以现构造出一个对象,然后给已有对象赋值;Stock stock1=Stock("wang",1,1.1);stock1=Stock("Nsd",1,2.1);这样新构造出来的对象赋值给stock1后,就调用析构函数,释放他的内存。