这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
更多class相关
Class Template
直接上例子:
template <class Type>
class Stack {
private:
enum {MAX = 10};
Type items[MAX];
int top;
public:
Stack();
bool isempty();
bool isfull();
bool push(const Type & item);
bool pop(Type & item); // pop top into item
};
template <class Type>
Stack::Stack() {
top = 0;
}
template <class Type>
bool Stack::isempty() {
return top == 0;
}
// ...
可以看到template也可在类定义中使用,提高了代码的复用性。使用很简单
Stack <std::string> st;
Template作为参数
在C++中存在这样的嵌套语法:
template <template <typename T> class Thing>
其声明与使用如下:
class Crab {
private:
Thing s1;
Thing s2;
public: Crab() {};
bool push(int a, double x) {
return s1.push(a) && s2.push(x);
}
bool pop(int & a, double & x){
return s1.pop(a) && s2.pop(x);
}
};
Crab<Stack> nebula; \\ 声明一个Crab的实例nebula
可以看到这种语法虽然乍一看有点难懂,结合用例还是容易理解的,此处的Thing在实现中是Stack类。
嵌套类
嵌套类(即Nested Class)指在一个类中声明另一个类的行为,举个栗子:
class Queue {
class Node {
public: Item item;
Node * next;
Node(const Item & i) : item(i), next(0) { }
};
...
};
这样就实现了类嵌套声明,然后你可以这样实现类方法:
bool Queue::enqueue(const Item & item) {
if (isfull()) return false;
Node * add = new Node(item);
...
}
这样做就实例化了一个Node对象。
由于C+++类中各种各样的作用域、继承、访问权限等问题,关于嵌套类有这样一些特点:虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。