读书笔记-C++PrimerPlus-8.2.6 对象、继承和引用10.2.5 修改实现

来源:互联网 发布:挪威的森林知乎 编辑:程序博客网 时间:2024/06/06 23:30

C++ Prime Plus 随笔-关于显示格式的总结

8.2.6 对象、继承和引用

本例使用一个ostream的例子用来说明了基类引用可以指向派生类并可以使用基类的方法。见代码如下所示:
//filefunc.cpp -- function with ostream & parameter#include <iostream>#include <fstream>#include <cstdlib>using namespace std;void file_it(ostream & os, double fo, const double fe[],int n);const int LIMIT = 5;int main(){    ofstream fout;    const char * fn = "ep-data.txt";    fout.open(fn);    if (!fout.is_open())    {        cout << "Can't open " << fn << ". Bye.\n";        exit(EXIT_FAILURE);    }    double objective;    cout << "Enter the focal length of your "            "telescope objective in mm: ";    cin >> objective;    double eps[LIMIT];    cout << "Enter the focal lengths, in mm, of " << LIMIT         << " eyepieces:\n";    for (int i = 0; i < LIMIT; i++)    {        cout << "Eyepiece #" << i + 1 << ": ";        cin >> eps[i];    }    file_it(fout, objective, eps, LIMIT);    file_it(cout, objective, eps, LIMIT);    cout << "Done\n";    // cin.get();    // cin.get();    return 0;}void file_it(ostream & os, double fo, const double fe[],int n){    // save initial formatting state    ios_base::fmtflags initial;    initial = os.setf(ios_base::fixed, ios_base::floatfield);    std::streamsize sz = os.precision(0);    os << "Focal length of objective: " << fo << " mm\n";    os.precision(1);    os.width(12);    os << "f.l. eyepiece";    os.width(15);    os << "magnification" << endl;    for (int i = 0; i < n; i++)    {        os.width(12);        os << fe[i];        os.width(15);        os << int (fo/fe[i] + 0.5) << endl;    }    // restore initial formatting state    os.setf(initial, ios_base::floatfield);    os.precision(sz);}
setf()提供的格式化方法方法设置模式setf(ios_base::fixed)对象设置为使用顶点表示模式setf(ios_base::showpoint)将对象设置为小数点模式precision()设置小数点的位数width设置下一次输出操作的字段宽度为0则表示恰好容纳显示的内容
 应该注意的是显示的在下一次更改前一直有效。所以这里使用了一个技巧用于保存之前的调用
    ios_base::fmtflags initial;    initial = os.setf(ios_base::fixed);/*代码块*/    os.setf(initial);

setf()返回调用它之前有效的所有格式化设置,ios_base::fmtflags这种格式可以用来保存所需的信息类型名称。

最后要说明的是每个对象都保存了自己的格式化设置。

10.2.5 修改实现

使用
std::cout.precision(3);
可以实现用定点法表示的三位小数。
同上例可以使用
std::streamsize
类型来定义并储存之前的信息,例如

std::streamsize prec = std:cout.precision(3);/*代码块*/std::cout.precision(prec);
1 0
原创粉丝点击