c++面向对象模板编程
时间: 2024-12-31 22:32:43 浏览: 11
### C++ 中面向对象编程与模板编程
#### 类和对象的概念
面向对象编程(OOP)是一种基于类和对象的编程范式。类是对具有相同属性和行为的对象的一种抽象表示,而对象则是该类的具体实例[^1]。
```cpp
class Rectangle {
public:
double length;
double width;
double area() const {
return length * width;
}
};
```
上述代码定义了一个名为 `Rectangle` 的类,其中包含两个公共成员变量 `length` 和 `width` 以及一个计算矩形面积的方法 `area()`。这里使用了 `const` 关键字修饰成员函数,表明此操作不会修改对象的状态[^3]。
#### 继承机制
继承允许创建一个新的类,称为子类或派生类,它可以从现有的父类那里获得某些特性。这有助于实现代码重用并建立层次结构关系。
```cpp
#include <iostream>
using namespace std;
// 基础类 Shape
class Shape {
protected:
string name;
public:
Shape(const string& n):name(n){}
virtual void draw()=0; //纯虚函数
};
// 派生自Shape的新图形 Circle
class Circle : public Shape {
private:
float radius;
public:
Circle(float r, const string& n="Circle"):radius(r), Shape(n){}
void draw(){
cout << "Drawing a circle with radius: " << radius << endl;
}
float getArea(){return M_PI*radius*radius;}
};
int main () {
Circle c(5);
c.draw();
}
```
这段代码展示如何利用继承构建不同类型的形状,并实现了多态性的概念——即通过基类指针调用实际属于派生类的行为[^2]。
#### 模板编程基础
C++ 支持泛型编程风格,使得编写能够处理多种数据类型的算法成为可能。模板提供了这种灵活性,让开发者可以写出不依赖于特定类型参数的通用组件。
##### 函数模板
当希望某个函数能适用于各种不同类型时就可以考虑采用函数模板:
```cpp
template<typename T>
T max(T x,T y){
return (x>y)?x:y;
}
```
上面的例子展示了怎样声明一个接受任意两种同种类型作为输入参数的最大值比较器;这里的 `<typename>` 或者也可以写作 `<class>` 来指定模板参数列表中的占位符名称[^4]。
##### 类模板
除了函数外还可以为整个类设置模板化版本,从而支持更多样的应用场合:
```cpp
template<class Type>
class Stack{
private:
vector<Type> elements;
public:
void push(Type const&);
void pop();
Type top() const;
bool empty() const{return elements.empty();}
};
template<class Type>
void Stack<Type>::push(Type const& elem){
elements.push_back(elem);
}
template<class Type>
void Stack<Type>::pop(){
if(elements.empty()) throw runtime_error("stack is empty");
elements.pop_back();
}
template<class Type>
Type Stack<Type>::top() const{
if(elements.empty()) throw runtime_error("stack is empty");
return elements.back();
}
```
在这个例子中,`Stack` 是一种容器类,它可以存储任何类型的元素。由于采用了模板技术,因此无需针对每种不同的基本类型重复定义相同的逻辑。
阅读全文