函数模板

来源:互联网 发布:ones刻录软件 编辑:程序博客网 时间:2024/06/06 03:14

看完《C++编程思想》第一巻,有种畅快的感觉,之前第一本C++书时《C++ primer plus》,虽然讲的很详细,但是没有体会到C++比C进步的地方,只是知道C++用类将数据和函数进行了封装,使得类可以继承,代码重用,至于多态什么的都是很快的就看过去了,没有很好的理解C++的精髓。看完《C++编程思想》第一卷,感觉C++确实相对C好不少。

C++的四个特性,封装,继承,多态,模板。

封装,1:通过封装使得数据在任何时候都能恰当的初始化,结束后能够销毁释放空间。2:同时封装将函数封装到类当中,一定程度上将函数分类,使得函数调用更加清晰。3:数据的封装避免了C当中大量的结构体。4:使得程序员能够专注于主要的逻辑思维的搭建。

继承,1:首先继承获得了代码重用的好处。2:继承使得编程时的逻辑思维更加清晰。

多态,多态确实算是C++的精华之一了,原理并不复杂,但是使得类的管理方便了许多,函数算法的编写也更加简单。

模板,这个确实太好用了,算法不用针对特定的数据类型,只要写好逻辑结构就可以了,虽然自己没写模板,不过用别人写的模板,使得编程方便了很多,很多。

《C++编程思想》太厚了,接下来要看看STL这个能够提高编程效率的工具,等下次有时间再看第二卷了,最后写了一个《C++编程思想》的一个栈堆模板实现。

#ifndef STACK_H_#define  STACK_H_#include <iostream>template<class T>class Stack{private:struct Link{T * data;Link *next;Link(T* dat, Link *nxt):data(dat), next(nxt){}} *head;public:Stack() : head(NULL){}~Stack(){while(head != NULL){tmp = head;head = head->next;delete tmp;}}void push(T* dat){head = new Link(dat, head);}T* peek()const{return head ? head->data : NULL;}T* pop(){T * tmp = head;head = head->next;return tmp;}class iterator;friend class iterator; class iterator {Link * p;public:iterator(const Stack<T> & t1): p(t1.head){}iterator(const iterator& t1): p(t1.p){}iterator(): p(NULL){}T *operator++() //++i{if (p != NULL){p = p->next;return p->data;}else{return NULL;}}T *operator++(int)//i++{if (p != NULL){Link *tmp = p;p = p->next;return tmp->data;}else{return NULL;}}T *operator*(){return p->data;} };};#endif


测试程序

#include "stackTemplate.h"#include <ctime>using namespace std;void main(){Stack<int> stackInt;srand(time(0));for(int i = 0; i < 10; i ++){int tmp = rand();cout<<tmp<<',';stackInt.push(new int(tmp));}cout<<endl;Stack<int>::iterator iter(stackInt);for(int i = 0; i < 10; i++, ++iter)cout<<**iter<<',';cout<<endl;for(int i = 0; i < 10; i++, ++iter)delete *iter;}


这段代码是按书上写的,不过不知道我买的书时盗版的问题,书上的源代码并不能通过vs2010的编译,有点代码还是得自己亲自写一下才知道可不可以。

这边发现一个有趣的现象就是充值i++和++i时,operator++()是前置版本,operator++(int)是后置版本,但是当后置版本还未编写时,iter++语句调用的确实前置版本的operator。


原创粉丝点击