面向对象编程和`GP`泛型编程

面向对象编程和GP泛型编程

c++标准库

标准库并不是用面向对象的概念设计出来的

面向对象的概念关键点:

  • classclass的继承关系

  • 虚函数 -> 抽象class或者接口

面向对象库复杂的点在于继承关系很复杂

OOP(Object-Oriented programming)

关键概念:

  • class的数据放在类里面

  • 操作数据的函数也放在类里面

GP(Generic Programming)

泛型编程的关键概念:

  • 将数据和操作数据的方法分开来

示例代码:

template<typename T, class Alloc = T>
class vector
{
   
};

template<typename _RandomAccessIterator>
inline void sort(_RandomAccessIterator _first, _RandomAccessIterator _last) {

}

分析:

  • sort方法并没有声明在vector类当中

  • 调用sort方法取到vector的数据通过iterator迭代器

  • sort算法通过iterator迭代器确定操作范围,通过iterator取用container的元素

关键字inline

作用:

  • 将方法声明成inline那么在调用到该方法的地方会直接将方法体的内容写到调用处

  • 不需要去call存储方法的内存地址在进入方法进行调用

没有inline

  • 函数调用模型就是在方法调用处找到函数地址然后再调用函数,调用完成回到方法执行处继续往下执行

GP编程当中一个形象的例子:

  • 由于数据和处理数据的算法分开.通过迭代器去联系在一起

  • 那么例如比较大小的行为,就需要数据去定义如何比较

例如比较两个类的大小:

示例代码:

#pragma
#ifndef __GPBIG__
#define __GPBIG__

#include <iostream>

using namespace std;

bool strLonger(const string& a, const string& b) {
return a.size() < b.size();
}

// 这个默认的比较大小是通过字符的ascii码来比较大小.比较每一个码的大小值
template<class T>
inline const T& max(const T& a, const T& b) {
return a < b ? b : a;
}

// 这个默认比较大小是通过传入的方法进行比较.定义了一个strLonger方法来比较
template<class T>
inline const T& max(const T& a, const T& b, Compare comp) {
return comp(a, b) ? b : a;
}

#endif // !__GPBIG__

可以看到具体的比较大小的行为:

  • 有一套默认的方法去比较

  • 可以自己声明需要的比较方式去比较

posted @ 2024-04-26 11:39  俊king  阅读(2)  评论(0编辑  收藏  举报