前端学C++

175 阅读2分钟

这是我参与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+++类中各种各样的作用域、继承、访问权限等问题,关于嵌套类有这样一些特点:虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。