OOP特性:抽象,封装和数据隐藏,多态,继承,代码的可重用性。
基本类型的三项工作:
(1)决定数据对象需要的内存数量。
(2)决定如何解释内存中的位。
(3)决定可使用数据对象的执行的操作或方法。
接口
接口由编写类的人提供的方法构成
实现成员函数
在类外定义成员函数使用作用域解析运算符::来标识函数所属的类
void Stock::update(double price)
方法可以访问类的私有成员
避免科学计数法:
std::cout.setf(std::ios_base::fixed,std::ios_base::floatfield);
显示三位小数
std::cout.precision(3);
类的构造函数和析构函数
声明和定义构造函数
构造函数的参数名不能和类成员相同
Stock::Stock(const string &co ,long n ,double pr)
{
conpany = co;
shares = n;
share_val = pr;
set_tot();
}
当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。
创建析构函数
Stock::~Stock(){
}
可以什么都没有
Stock::~Stock(){
cout << "Bye"<<company<<"!\n";
}
何时调用析构函数?
如果创建的是静态存储类对象,则其析构函数将在程序结束时自动调用。
如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动被调用。
如果对象是通过new创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将被调用。
int main()
{
{
....
}
}
在main函数中间多加个大括号可以让客户看见析构函数显示内容
如果已经定义了stock1后又有stock1 = Stock{.....};语句
因为stock1已经存在,因此该语句不是对stock1初始化,而是将新值赋给他,创建一个新的临时对象,将其内容复制给stock1来实现。随后程序调用析构函数以删除临时对象。
保证函数不修改对象
void show() const;
void stock::show() const;
this指针
*this作为调用对象的别名
const Stock & Stock::topval(const Stock &s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
对象数组
和普通数组操作差不多
类作用域
在类中定义的名称的作用域都为整个类,不能从外部直接访问类的成员。
作用域为类的常量
不能用const声明成员变量
class Bakery
{
private:
const int Months = 12;//FAILS
...
}
可以声明一个枚举,在类声明中声明一个枚举的作用域为整个类
class Bakery
{
private:
enum {Months = 12};
double costs[Months];
...
}
在作用域为整个类的代码中遇到Months时,编译器都将用12代替它
注意:用这种方式声明枚举并不会创建类数据成员
或者使用static关键字声明
class Bakery
{
private:
static const int Month = 12;
..
}
创建的Month变量和其他静态变量存储在一起
枚举可能带来的冲突
enum egg{Small,Medium,Large};
enmu t_shirt{Small,Medium,Large};
可以使用class或者struct
enum class egg{...};
enum class t_shirt{...};
enum strcut egg{..};
使用时需要使用枚举名来限定枚举量
egg choice = egg::Large;
t_shirt Floyd = t_shirt::Large;
在有些情况下,常规枚举将自动转换为整型,如将其赋给int变量或用于比较表达式时,但作用域内枚举不能隐式的转换为整型。
抽象数据类型
程序员通常通过定义类来表示更通用的概念
使用类实现抽象数据类型是一个不错的选择,例如实现栈
stack.h
#ifndef STACK_H_
#define STACK_H_
typedef unsigned long Item;
class Stack
{
private:
enum {MAX = 10};
Item items[MAX];
int top;
public:
Stack();
bool isempty() const;
bool isfull() const;
bool push(const Item & item);
bool pop(Item & item);
};
#endif
stack.cpp
#include"stack.h"
Stack::Stack()
{
top == 0;
}
bool Stack::isempty() const
{
return top == 0;
}
bool Stack::isfull() const
{
return top == MAX;
}
bool Stack::push(const Item & item)
{
if (top < MAX)
{
items[top++] = item;
return true;
}
else
return false;
}
bool Stack::pop(Item & item)
{
if(top > 0)
{
item = items[--top];
return true;
}
else return false;
}