您的位置:首页 > 编程语言

第二章 面向对象的编程风格(使用静态局部变量)

2015-04-19 15:06 302 查看
2.4使用局部静态对象 //完整程序还未打出,有错误


程序:使用局部静态对象

2.2节当中fibon_seq()函数每次被调用时,便计算出fibonacci数列(元素由用户指定),并以一个vector存储计算出来的元素,然后返回,这很费时间。事实上,我们只需存储一个fibonacci数列的vector。毕竟其中的元素是不会改变的。从fibon_seq()的某次调用到下一次调用,这中间唯一会改变的只是用户指定的元素个数而已。请看下面对fibon_seq()进行的三次调用:

fibon_seq(24);

fibon_seq(8);

fibon_seq(18);

每一次调用便已计算出第二,三次所需要计算的值。倘若第四次调用需要计算32个元素,而我们有能力将每次调用所计算出来的元素存储起来,那么在第四次调用我们也只需再计算#25~#32这些元素值。这要如何办到?

在函数内部声明局部local vector对象并不能解决问题,因为局部对象会在每次调用函数时候建立,并在函数结束时候同时被弃置。如果将vector对象定义于file scope之中,又过于冒险。是的,为了节省函数间的通讯问题而将对象定义于file scope内,永远是一种冒险。通常file scope会打乱不同函数之间的独立性,使它们难以理解。

const vector<int>*

fibon_seq(int size)

{

static vector<int>elems;

return &elems;

}

此刻elems被定义为fibon_seq()中的局部静态对象。这意味着什么呢?和局部静态对象不同的是,局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续的存在。elem的内容不再像以前一样在fibon_seq()每次调用时被破坏又重新建立。这也就是我们可以安全的将elems的地址返回的原因。

局部静态对象使我们可以定义一个持有fibonacci数列的vector,每当调用fibon_seq()时,我们只需计算那些尚未被放入elems的元素即可。以下是一种可能的实现方式:

const vector<int>*

fibon_seq(int size)

{

const int max_size=1024;

static vector<int>elems;

if(size<=0||size>max_size)

{

cerr<<"fibon_seq():oops:invalis size:"

<<size<<"--cant fulfill request.\n";

returo 0;

}

//如果size等于或小于elem.size()

//那就不必重新计算了,因为elem.size()是已经存在的值。比如elem(18)已经存在。求elem(32)就直接从elem(18)开始求。

if(ix==0||ix==1)

elems.push_back(1);

else elems.push_back(elem[ix-1]+elems[ix-2]);

}

return &elems;

}

先前我们定义过的Vector,其元素个数皆固定。并且其事先已存在的元素也进行了赋值。这个版本的fibon

_seq()无法事先预测需要多大的vector。我将elems定义为一个空的vector,并按照所需插入必要的元素。Push

_back()会将数值放在vector末端。vector class提供有内存自动管理机制.

课堂小结:加了static,函数调用后值仍在。

如果不加,则函数调用后值释放。

完整程序:

#include<iostream>

#include<vector>

using namespace std;

int main()

{

cout<<"plesse enter the position of Fibonacci";

cin>>elems;

fibon_elem(int size)

cout<<elems;

}

const vector<int>*

fibon_elem(int size)

{

const max_size=1024;

static vector<int>elems;

if(size<=0||elem>max_size)

{

cerr<<"fibon_seq():oops:invalis size:";

<<size<<"can't fullfill request.\n";

return 0;

}

if(size=0||size=1)

elems.push_back(1)

else

elems.push_back(elem[ix-1]+elem[ix-2])

}

return &elems*

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: