抽象和类
类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。
#ifndef STOCK00_H_
#define STOCK00_H_
#include <string>
class Stock
{
private://可不写,默认是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
访问控制
关键字private和public描述了对类成员的访问控制。使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数(或友元函数)来访问对象的私有成员。
公有成员函数是程序和对象的私有成员之间的桥梁,提供了对象和程序之间的接口。
防止程序直接访问数据被称为数据隐藏。
将实现的细节放在一起并将它们与抽象分开被称为封装。
内联方法
void set_tot(){total_val = shares * share_val;}//内联函数
类声明常将短小的成员函数作为内联函数,set_tol()符合这样的要求。
也可以在类声明之外定义成员函数,使之成为内联函数,只需在类实现部分中定义函数时使用inline限定符即可。
class Inline_test
{
private:
void test();
public:
};
inline void Inline_test::test()//using inline in definition
{
}
实现类成员函数
- 定义成员函数时,使用作用域解析运算符::来标识函数所属的类
- 类方法可以访问类的private组件
#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 nagative;"
<< company << " shares set to 0.\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
void Stock::buy(long num,double price)
{
if(num<0)
{
std::cout << "Number of shares purchased can't be negative. "
<< "Transaction is aborted.\n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num,double price)
{
using std::cout;
if (num<0)
{
cout << "Number of shares sold can't be negative. "
<< "Transaction is aborted.\n";
}
else if(num > shares)
{
cout << "You can't sell more than you have! "
<< "Transaction is aborted.\n";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
void Stock::show()
{
using std::cout;
cout << "Company: " << company << "Shares: "
<< shares << '\n' << "Share Price: $"
<< share_val << " Total Worth: $"
<< total_val << '\n';
}
使用类
要创建类对象,可以声明类变量,也可以使用new为对象分配存储空间,可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个。
- 声明类:
Stock joe,kate;
- 使用成员的成员函数
joe.show();//通过成员运算符(.)
所创建的每个新对象都有自己的存储空间,用于存储其内部变量和类成员,但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
假设kate和joe都是Stock对象,则kate.shares将占据一个内存块,而joe.shares占用另一个内存块;但kate.show()和joe.show()都调用同一个方法,也就是说它们执行同一个代码块,只是这些代码用于不同的数据。
#include<iostream>
#include"stock00.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.125);
fluffy_the_cat.show();
fluffy_the_cat.sell(300000,0.125);
fluffy_the_cat.show();
return 0;
}