1. 编程范型
编程范型 或 编程范式(英语:Programming paradigm),(范 即模范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程、程序编程、面向对象编程、指令式编程等等为不同的编程范型。
编程范型提供了(同时决定了)程序员对程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。
正如软件工程中不同的群体会提倡不同的“方法学”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的(如Smalltalk和Java支持面向对象编程,而Haskell和Scheme则支持函数式编程),同时还有另一些语言支持多种范型(如Ruby、Common Lisp、Python和Oz)。
很多编程范型已经被熟知他们禁止使用哪些技术,同时允许使用哪些。例如,纯粹的函数式编程不允许有副作用[1];结构化编程不允许使用goto。可能是因为这个原因,新的范型常常被那些习惯于较早的风格的人认为是教条主义或过分严格。然而,这样避免某些技术反而更加证明了关于程序正确性——或仅仅是理解它的行为——的法则,而不用限制程序语言的一般性。
编程范型和编程语言之间的关系可能十分复杂,由于一个编程语言可以支持多种范型。例如,C++设计时,支持过程化编程、面向对象编程以及泛型编程。然而,设计师和程序员们要考虑如何使用这些范型元素来构建一个程序。一个人可以用C++写出一个完全过程化的程序,另一个人也可以用C++写出一个纯粹的面向对象程序,甚至还有人可以写出杂揉了两种范型的程序。
2.泛型编程
2.1 C++的泛型即为模板。
C++泛型的参数可以代表类或个别对象。C++无法对泛型的类型参数进行约束。在编译时,每个被使用的封闭泛型类型(即是所有泛型参数的实际类型都已被指明的泛型)都会有独立的编码产生,编译程序会在此时确保类型安全性。可是如果泛型要运用其泛型参数的某成员,而该泛型参数又不包含该成员的时候,编译程序所产生的错误信息或会看似与实际问题无关,增加除错的难度。
class vector{
T* v;int sz;public:vector(int);T& operator[](int);T& elem(int i) { return v[i]; }// ...
};
模板处理的数据并不限于某种特定的数据类型;
泛型编程仍需要编写自己的函数和类,但它们的数据类型不受限制。程序员提供的数据类型,编译器可以根据模板即时生成实用代码。
编写代码时,一般使用占位符 (T) 来替代数据类型。
【例】
template<class T>
void fun(T parm)
{
// do sth
}
2.3.1 函数模板
【例】
// swap
......
template<class T>
swap( T &a , T &b )
{
......
}
......
【注】
其实, template< class T > 与 template< typename T > 是一个含义,同等使用;
【另】
如果函数对不同数据类型有相同操作 —— 使用模板;
如果函数对不同数据类型有不同操作 —— 使用重载;
2.3.2 类模板
template< class T >
class myclass
{
myclass( );
void fun( T &a,T &b );
}
【注】
模板构造器的实现,不再像传统的格式书写,即 ‘myclass::myclass()’,这样编译器不知道这是个模板,因此,初始化构造器实现如下:
myclass<T>::myclass
{
// 初始化;
}
例:(FIFO -- 栈操作)
//类模板的定义:
template< class T >
class Stack
{
public:
Stack( unsugned int size = 100 ) ; // 构造器
~Stack( ) ; // 析构器
void push( T value ) ; // 类方法
void pop( ); //类方法
private:
unsigned int size;
unsigned int sp;
T *data;
};
// 构造器
template<class T>
Stack<T>::Stack ( unsigned int size )
{
this --> size = size;
data = new T [size];
sp = 0;
}
// 析构器
template < class T >
Stack< T >::~Stack( )
{
delete [ ]data;
}
// 类方法
template < class T >
void Stack<T>::push( T value )
{
data [sp++] = value;
}
template< class T>
T Stack<T> ::pop( )
{
return data[--sp];
}
int main( )
{
Stack< int >int Stack( 100 );
int Stack.push(1);
int Stack.push(11);
int Stack.push(3);
std::cout << int Stack.pop() << "\n";
std::cout<< int Stack.pop() <<"\n";
std::cout<< int Stack.pop() <<"\n";
return( 0 );
}
2.3.3 内联模板
(未完 !)