Essential c++2.3-2.4
2016-12-06 01:27
295 查看
一般的程序编写法则是,以“参数传递”作为函数间的沟通方式,比“直接将对象定义与全局”更恰当。函数如果过度依赖定义于file scope 内的的对象,就比较难以在其他环境中重用,也比较难以修改
每次调用都要传入一个ofstream对象,而且用户无法关闭我们所产生的信息。,我们希望用户不但不必指定输出用的stream,而且有能力把输出信息关闭。默认情况下我们不想产生这些信息,但是我们又希望让那些想看到这些信息的用户可以产生它们,甚至指定其输出文件————设定默认值
display()仍然将输出写死到cout身上,一般情况下输出至cout最好,但是有时候用户可能会希望提供一个不同的目的地,例如文件。解决就是让cout成为默认的ostream参数
规则;
默认值的解析操作必须从最右边开始,如果为某个参数提供了默认值,那么这一参数右侧的所有参数都必须具有默认参数值才行,
默认值只能指定一次,在函数声明处,或者函数定义处
默认值放在函数的声明里
2.4使用局部静态对象
局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在。因此我们可以安全地将elems的地址返回。
局部静态对象使我们可以定义一个持有f数列的vector。每当调用fibon_seq()时,我们只需要计算那些尚未被放入elems的元素即可,以下是一种可能实现的方式
void bubble_sort(vector<int> &vec,ofstream &ofil) { for(int ix=0;ix<vec.size();++ix) for(int jx=ix+1;jx<vec.size();++jx) if(vec[ix]>vec[jx]) { ofil<<"about to call swap! ix:"<<ix <<"jx:"<<jx<<"\tswapping:" <<vec[ix]<<"with"<<vec[jx]<<endl; swap(vec[ix],vec[jx],ofil); } }
每次调用都要传入一个ofstream对象,而且用户无法关闭我们所产生的信息。,我们希望用户不但不必指定输出用的stream,而且有能力把输出信息关闭。默认情况下我们不想产生这些信息,但是我们又希望让那些想看到这些信息的用户可以产生它们,甚至指定其输出文件————设定默认值
void bubble_sort(vector<int> &vec,ofstream *ofil=0) { for (int ix=0;ix<vec.size();++ix) for(int jx=ix+1;jx<vec.size();++jx) if(vec[ix]>vec[jx]) { if(ofil!=0) (*ofil)<<"about to call swap! ix:"<<ix <<"jx:"<<"\tswapping:" <<vec[ix]<<"with"<<vec[jx]<<endl; swap(vec[ix[,vec[jx],ofil); ``` 当用户以单一参数调用bubble_sort()时,不会产生任何调试信息。如果调用时带有第二个参数,指向某个ofstream对象,那么函数便会产生调试信息。
int main() { int ia[8]={8,32,3,13,1,21,5,2}; vector<int> vec(ia,ia+8); bubble_sort(vec); display(vec); ofstream ofil("data.txt"); bubble_sort(vec,ofil); display(vec,ofil); }
display()仍然将输出写死到cout身上,一般情况下输出至cout最好,但是有时候用户可能会希望提供一个不同的目的地,例如文件。解决就是让cout成为默认的ostream参数
void display(const vector<int> &vec,ostream &os=cout) { for(int ix=0;ix<vec.size();++ix) os<<vec[ix]<<' '; os<<endl; }
规则;
默认值的解析操作必须从最右边开始,如果为某个参数提供了默认值,那么这一参数右侧的所有参数都必须具有默认参数值才行,
默认值只能指定一次,在函数声明处,或者函数定义处
默认值放在函数的声明里
void display(const vector<int>&,ostream&=cout);
2.4使用局部静态对象
const vector<int>* fibon_seq(int size) { static vector<int> elems; return &elems;
局部静态对象所处的内存空间,即使在不同的函数调用过程中,依然持续存在。因此我们可以安全地将elems的地址返回。
局部静态对象使我们可以定义一个持有f数列的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:invaild size:" <<size<<"--can not fulfile request.\n"; return 0; } //size小于或者等于elems.size(),不必重新计算 for(ix=elem.size;ix<size;ix++) { if(ix==0||ix==1) elems.push_back(1); else elem.push_back(elems[ix-1]+elems[ix-2]); } return &elems; }
相关文章推荐
- openldap 2.3 和2.4 常见问题和比较
- UNIX网络高级编程第2章传输层UDP TCP和SCTP 2.2总图2.3用户数据报协议2.4传输控制协议2.5SCTP
- FCKeditor2.4(FCKeditot for java2.3)的用法及配置参数说明(已解决中文乱码)
- web.xml & web-fragment.xml (Servlet 2.3, 2.4, 2.5 + 3.0)模板
- 不同版本(2.3,2.4,2.5)的Servlet web.xml 头信息
- 平台2.3升级到2.4的问题
- 不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息
- 不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息
- 基于Ubuntu 11.10/12.04编译OpenCV 2.3.x和2.4.x(适用于Fedora和红帽子rhel 6.2)
- MongoDB 2.4 RC2 (2.3 开发系列) 发行说明
- 一周第五次课(10月20日) 2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令
- 2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令
- OC视频笔记2.3(OC继承的使用)2.4(self与super)2.5(方法的重写)
- web.xml 2.3/2.4/2.5/3.0头部
- 平台2.3升级到2.4的问题2
- Vue 2.3、2.4 知识点小结
- sota系统构架及目录说明(章节:2.3-2.4)
- 2.3 添加代码注释;2.4 术语
- 不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息
- 究竟是昨天(2.3)立春还是今天(2.4)立春?易语言告诉你真相