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

Essential c++2.3-2.4

2016-12-06 01:27 295 查看
一般的程序编写法则是,以“参数传递”作为函数间的沟通方式,比“直接将对象定义与全局”更恰当。函数如果过度依赖定义于file scope 内的的对象,就比较难以在其他环境中重用,也比较难以修改

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