第二章 面向对象的编程风格(使用静态局部变量)
2015-04-19 15:06
302 查看
2.4使用局部静态对象 //完整程序还未打出,有错误
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
程序:使用局部静态对象
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*
}
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/wail.gif)
程序:使用局部静态对象
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*
}
相关文章推荐
- 第二章 面向对象的编程风格(提供默认参数值)
- 第二章 面向对象的编程风格(调用函数)
- 第二章 面向对象的编程风格(提供重载函数)
- 第二章 面向对象的编程风格(声明inline函数)
- 第二章 面向对象的编程风格(如何编写函数)
- linux shell编程指南第二章------使用find和xargs1
- C++编程规范 编程风格 学习 (3) -- 避免使用“魔数”
- 从一而终只使用一种Spring编程风格
- -PHP面向对象(OOP)编程入门-7.$this的使用
- 使用MYSQL数据库实现编程----第二章第三章课堂知识小总结
- 在Javascript中使用面向对象的编程(翻译)
- 在Javascript中使用面向对象的编程
- 第五章 面向对象的编程风格(不带继承的多态)
- 裸奔编程之使用Servlet实现REST风格 单纯使用Servlet进行完成REST解析
- 面向对象的Windows编程实战(上)(使用C++和Win32 API)
- 使用 COM 风格的编程接口
- 新ATM机 学会使用面向对象的思想来编程
- javascript高级编程3第二章:在html中使用javascript
- 使用面向对象的编程思想写一个简单的控制台计算器程序,放松一下
- Java的GUL编程中使用JButton的子类实现统一风格的按钮