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

来源:互联网 发布:最后的狮子 知乎 编辑:程序博客网 时间:2024/05/23 14:37

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*

}

0 0
原创粉丝点击