第二章 面向对象的编程风格(使用静态局部变量)
来源:互联网 发布:最后的狮子 知乎 编辑:程序博客网 时间: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*
}
- 第二章 面向对象的编程风格(使用静态局部变量)
- 第二章 面向对象的编程风格(调用函数)
- 第二章 面向对象的编程风格(如何编写函数)
- 第二章 面向对象的编程风格(声明inline函数)
- 第二章 面向对象的编程风格(提供默认参数值)
- 第二章 面向对象的编程风格(提供重载函数)
- 第五章 面向对象的编程风格(面向对象的编程思维)
- 第五章 面向对象的编程风格(面向对象编程概念)
- Essential C++ 第二章,面向过程的编程风格
- Java笔记 第四章(2)Java面向对象编程基础 第二部分(类的成员变量和方法)
- delphi 局部静态变量的使用
- C++:静态局部变量的使用
- 黑马程序员------面向对象(No.1)(面向对象的理解、成员变量、局部变量、匿名对象)
- 面向对象_成员变量和局部变量的区别
- 面向对象成员变量和局部变量的区别
- 全局变量、局部变量(auto局部变量)、静态全局变量、静态局部变量的区别
- 全局变量、局部变量(auto局部变量)、静态全局变量、静态局部变量的区别
- 初识面向对象(成员变量和局部变量)
- Git教程:多人协作
- 心急的C小加
- 关于我与IT
- Android 中图片压缩处理的方式(附源代码)
- Git教程:使用GitHub
- 第二章 面向对象的编程风格(使用静态局部变量)
- leetcode Count and Say
- ios NSTimer的基本用法
- 绝对值排序
- android ExpandableListView详解
- 类模板
- RFID第三次作业
- 在控制台编译运行java程序详细指导
- 归并排序