基类、父类、顶层类、抽象类
子类、派生类
在C++中,模板类(Template Class)是一种通用的类模板,可以根据不同的数据类型生成具体的类。模板类允许将类的定义与实际使用分离,提供了代码复用和泛型编程的方式。
模板类的语法形式如下:
template <typename T>
class ClassName {
// 类成员和方法
};
其中,template 是模板声明的开始部分,T 是一个占位符类型,表示在实例化模板时将被替换为具体的数据类型。T 可以根据需要自定义,比如使用 typename 或 class 关键字来指定类型参数。
通过使用模板类,可以创建适用于不同数据类型的对象,而无需为每个特定数据类型编写单独的类定义。例如,以下是一个模板类 Stack 的示例代码:
template <typename T>
class Stack {
private:
T* stackArray; // 数据存储数组
int top; // 栈顶指针
int capacity; // 栈的容量
public:
Stack(int size) : capacity(size), top(-1) {
stackArray = new T[capacity];
}
~Stack() {
delete[] stackArray;
}
void push(const T& item) {
if (top == capacity - 1) {
// 栈已满
// 扩展栈的容量或抛出异常...
} else {
stackArray[++top] = item;
}
}
T pop() {
if (top == -1) {
// 栈为空
// 抛出异常或返回默认值...
} else {
return stackArray[top--];
}
}
// 其他栈操作方法...
};
在上述示例中,Stack 是一个模板类,使用 typename T 作为类型参数。在模板类的成员函数中,可以使用 T 表示具体的数据类型。
通过实例化模板类,可以创建不同类型的栈对象,如 Stack、Stack 等。编译器会根据实际使用情况自动进行类型推导,生成对应的具体代码。
Stack<int> intStack(10);
intStack.push(42);
int poppedItem = intStack.pop();
Stack<double> doubleStack(5);
doubleStack.push(3.14);
double poppedItem = doubleStack.pop();
模板类的优点是可以提供通用和灵活的代码,适用于多种数据类型。它能够在编译时进行类型检查,并减少代码冗余。模板类广泛应用于容器类(如向量、链表、队列、映射等)、算法和数据结构的实现。
需要注意的是,模板类的定义通常直接放在头文件中,因为编译器需要在每个使用模板类的地方生成相应的代码。
在C++中,友元函数(friend function)是在类的声明中被声明为友元的非成员函数。友元函数可以访问类的私有成员和受保护成员,即使它们不是类的成员。通过友元函数,我们可以允许其他函数或类直接访问另一个类的私有或受保护成员。
下面是一些关于友元函数的特点和用途:
友元函数的声明通常出现在类的内部,但不是类的成员函数。它可以在类的任何地方进行声明,例如在公共、私有或保护部分。
友元函数的定义必须在类外部进行,与类的定义分开。
友元函数在其定义中使用类的对象作为参数来访问类的成员。
友元函数被声明为友元后,它就可以直接访问该类的私有成员和受保护成员,而无需通过对象调用。
友元函数不继承,也不属于类的成员,因此不能被派生类继承。
友元函数对于需要操作类的私有数据或实现与该类紧密相关的功能的函数非常有用。例如,在重载运算符时,可以使用友元函数来直接访问类的私有成员并执行相应的操作。另一个例子是,如果你想实现一个函数,该函数需要访问多个类的私有成员以执行某些操作,那么你可以将该函数声明为这些类的友元函数。
下面是一个简单的示例,展示了友元函数的使用:
#include
class MyClass {
private:
int data;
public:
MyClass(int value) : data(value) {
}
friend void printData(const MyClass& obj);
};
void printData(const MyClass& obj) {
std