这一章的目的是设计一个class
。一般class
由两部分组成:(1)一组公开的(private)操作函数和运算符;(2)一组私有的(private)实现细节。这些操作函数和运算符称为类的成员函数(member function)。
1、如何实现一个Class
以stack
为例,定义类先从所谓的抽象(abstraction)开始。本例栈中存放string
类型。
Class
的声明,然后也可以用类指针(class pointer)来定义:
class Stack;// 类的声明
Stack *pt = 0; // 定义类指针
void process(const Stack&); // 以Stack作为数据类型
接下来,需要定义Stack
类的骨架本身:
class Stack{
public:
// ...public的接口函数
private:
// ...private的接口函数
};
上面可以看到,Class
的定义是由两部分组成的:(1)类的声明;(2)声明之后的主体。主体里面一般有两部分,其中public member
可以在程序的任何地方访问,private member
只能在类的内部或者是class friend
中访问。下面是类的起始定义:
class Stack{
public:
bool push(const string& );
bool pop(string &elem );
bool peek(string &elem);
bool empty();
bool full();
//size()定义在class本身中,其余成员函数仅仅是声明。
int size(){
return _stack.size();
}
private:
vector<string> _stack;
};
下面说明如何定义并使用类中的成员函数:
void fill_stack(Stack &stack, istream &is = Cin){
string str;
while(is >> str and !stack.full())
stack.push(str);
cout << "Read in " << stack.size() << "elements" << endl;
}
所有的成员函数必须在类内声明但是否在类内定义可以自由决定。如果在类内定义,这个成员函数被视为内敛(inline)函数。如果子啊类的外部定义,必须在前面加上关键字inline:
inline bool Stack::empty(){
return _stack.empty();
}
inline bool Stack::pop(string &elem){
if(empty())
return false;
elem = _stack.back();
_stack.pop_back();
return true;
}
上面的Stack::empty()
告诉编译器,函数是类内部的,并且两个冒号即所谓的类作用于解析(class scope resolution) 运算符。
下面是class Stack
中其余成员函数的定义。
inline bool Stack::full(){
return _stack.size() == _stack.max_size();
}
inline bool Stack::peek(string &elem){
if(empty())
return false;
elem = _stack