本篇主要讲了转换函数的利与弊以及简要介绍流与iostream文件

因为在本篇仍然要使用上篇的Stonewt类,这里首先给出其代码

<span style="font-size:18px;">ifndef STONEWT_H
using std::cout;
#define STONEWT_H class Stonewt
{
public:
Stonewt(double lbs,int stn);
{
stone=stn;
pds_left=lbs;
pounds=stn*Lbs_per_stn;
} Stonewt(double lbs)
{
stone=int(lbs)/Lbs_per_stn;//integer divition
pds_left=int(lbs)%Lbs_per_stn+lbs-int(lbs);
pounds=lbs;
} stonewt() {stone=pounds=pds_left=0;};
virtual ~Stonewt() {};
void show_lbs() const {cout<<pounds<<"pounds\n";};
void show_stn() const {cout<<stone<<"stone,"<<pds_left<<"pounds\n";}; private:
enum{Lbs_per_stn=14};
int stone;
double pds_left;
double pounds;
}; #endif // STONEWT_H</span>

11.1 转换函数

由上篇我们知道,由隐式转换我们科以把一个double类型的值赋给Stonewt对象,可是,能够做相反的转换吗?也就是

<span style="font-size:18px;">Stonewt wolfe(285.7);
double host=wolfe;//possible??</span>

要进行这样的相反的转换,必须使用特殊的C++运算符函数——转换函数。转换函数是用户定义的强制类型转换,能够像使用强制类型转换那样使用它们。假设定义了转换函数,则能够进行以下的转换

<span style="font-size:18px;">Stonewt wolfe(285.7);
double host=double(wolfe);
double star=(double)wolfe;</span>

11.2 创建转换函数

要转换typename类型,须要使用这样的形式的转换函数

<span style="font-size:18px;">operator typename();</span>
  • 请注意一下几点:
  • 转换函数必须是类方法;
  • 转换函数不能指定返回类型;
  • 转换函数不能有參数。

这里我们能够给出Stonewt的转换函数

<span style="font-size:18px;">Stonewt::operator int() const
{
return int(pounds+0.5);
} Stonewt::operator double() const
{
return pounds;
}</span>

此后,我们写这种语句将是合法的

<span style="font-size:18px;">Stonewt poppins;
long gone=(double)poppins;
long gone=int(poppins);</span>

11.3 转换函数的缺点

和转换构造函数一样,转换函数也有其缺点。提供自己主动运行、隐式转换的函数所存在的问题是:在用户不希望进行转换时,转换函数也可能进行转换。为了避免这样的情况我们能够用explicit。有了例如以下的声明后,需可将运算符声明为显式的

<span style="font-size:18px;">explicit operator int() const;
explicit opreator double() const;</span>

总之,C++为类提供了以下的类型转换:

  • 仅仅有一个參数的类构造函数用于将类型与该參数形同的值转换为类类型。比方,将int值赋给Stonewt对象时,接受int參数的Stonewt类构造函数将自己主动被调用。能够在构造声明中用explicit防止隐式转换。
  • 被称为转换函数的特殊成员运算符函数,用于将类对象转换为其它类型,转换函数是类成员,没有返回值、没有參数、名为operator typename()。将类对象赋给typename变量或将其转换为typename是,该函数将自己主动被调用。

学习了这么多类的知识,一时难以消化,这里最好还是临时转入对文件的输入输出中

11.4 流与缓冲区

C++把输入和输出看做字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。输入流中的字节可能来自键盘,也可能来自从初设备或其它程序。相同,输出流中的字节能够流向屏幕、打印机、存储设备或其它设备。流充当了程序和流源或流目标之间的桥梁。

输入流须要两个连接,每端各一个。文件端部连接提供了流的来源,程序端连接将流的输出部分转储到程序中。相同,对输出管理包含将输出流连接到程序以及将输出目标与流关联起来。通常,通过使用缓冲区能够更高效的处理输入和输出。缓冲区是用作中介的内存块,它是将信息从设备传输到程序或从程序传输给设备的暂时存储工具。。通常,像磁盘存储器这样的设备已512字节的块为单位来传输信息,而程序通常每次仅仅能处理一个字节的信息。缓冲的方法则是从磁盘中读取大量的信息,将这些信息存储到缓冲区中,然后从缓冲区中每次读取一个字节。由于从内存中读取数据比从磁盘中块的多,因此这样的方式更高效。

键盘每次提供一个字符,因此在这样的情况下,程序无需缓冲区来帮助匹配不同的传输数据效率。然而,对键盘输入进行缓冲能够让用户在将输入传输给程序之前返回并更正。C++程序通常在用户按下回车时刷新输入缓冲区。这就是为什么程序要到用户按下回车的时候在进行处理。对于屏幕输出,C++程序通常在用户发出换行符是刷新输出缓冲区。

11.5 流、缓冲区与iostream文件

管理流和缓冲区的工作有点复杂,iostream包括一些专门的设计来实现管理流和缓冲区的类。

  • streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、訪问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法;
  • ios_base类表示流的一半特征,如是否科读取、是二进制还是文本流等;
  • ios类基于ios_base类,当中包含了一个指向streambuf对象的指针成员;
  • ostream类从ios类中派生而来,提供了输出的方法;
  • ostream类也是从ios类派生而来的,提供了输入的方法;
  • iostream类是基于istream和ostream类的,因此继承了输入方法和输出方法。

这里在略微介绍下iostream类库管理的一些细节:

  • cin对象相应于标准输入流。在默认情况下,这个流被关联到标准的输入设备(键盘),wcin,wcout与此类似,可是处理的是wchar_t类型;
  • cout对象与标准输出流相相应。在默认的情况下,这个流被关联在标准的输出设备(显示器)中,wcout对象于此类似,可是处理的是wchar_t类型;
  • cerr对象与标准错误流相相应。在默认情况下,这个流被关联在标准输出设备(显示器)。这个刘没有被缓冲,这意味着信息将被直接发送给屏幕,而不会等到缓冲区填满或是新的换行符。werr语气类似。
  • clog对象也相应于标准错误流。在默认情况下,这个流被关联在标准输出设备(现实器),这个流被缓冲。wclog与此相类似。
  • 对象代表流——这意味这什么呢?当iostream文件为程序声明一个cout对象时,该对象将包含存储了与输出有关的信息的数据成员,如现实数据时使用的字段宽度、小数位数、计数方法以及用来处理缓冲区的streambuf对象的地址。以下的语句是通过是想streambuf对象将字符串中的字符放入到cout管理的缓冲区中
<span style="font-size:18px;">cout<<"bju Masd";
</span>

今天状态不是太好(预计是由于今天要回学校,内心一直静不下来),就写这么多了

C++ Primer Plus的若干收获--(十一)的更多相关文章

  1. C++ Primer Plus的若干收获--(二)

    哎,真是不想吐槽考驾照的艰辛历程了.跑到大西郊,顶着大太阳,一天就能摸上个十几分钟二十分钟的车,简直不要太坑爹,这两天真是做的我屁股疼的不行. .. 今天果断不去了.仅仅可惜我的大阿根廷啊,坚持到最后 ...

  2. C++ Primer Plus的若干收获--(九)

    这篇博文我接着上一篇来写,相同讲一些关于类的一些基础知识. 本篇将会继续使用上篇的股票类STock,这里给出接口 ifndef STOCKOO_H_ #define STOCKOO_H_ #inclu ...

  3. C++ Primer Plus的若干收获--(三)

    有时候怀疑真是怀疑自己走的路究竟是不是正确的.作为一个土生土长数学系学生,却对数学毫无兴趣,没事的时候就喜欢躲在图书馆看看有关计算机的书.有时候期末考试时候会挂个一两门的数学专业课,有时候真希望数学课 ...

  4. 学习C++ Primer 的个人理解(十一)

    关联容器 就像是个字典, 其元素是 键 - 值 对. 关键字起到索引作用. 有序: map:关联数组:保存 健-值 对 set : 关键字既是值. multimap : 关键字可重复出现的map mu ...

  5. C primer plus 读书笔记第十一章

    本章标题是字符串和字符串函数.主要是了解和字符串有关的函数. 1.字符串表示和字符串I/O 主要内容:字符串常量和字符串数组的初始化,对比了指针和字符串. 其中要注意的是,数组初始化是从静态存储区把一 ...

  6. C++ Primer Plus学习:第十一章

    运算符重载 使用方法: 在类的声明中定义重载运算符 datatype operator操作符(datatype); 定义:datatype classname:: operator操作符(dataty ...

  7. C Primer Plus学习笔记(十一)- 存储类别、链接和内存管理

    存储类别 从硬件方面来看,被储存的每个值都占用一定的物理内存,C 语言把这样的一块内存称为对象(object) 对象可以储存一个或多个值.一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相 ...

  8. C语言培训第一天

    下面是一些命令,先来谈谈今天的若干收获吧! 计算机中的一切文件都是以二进制补码的形式存在,问题也就来了. 第一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?(似乎问题和上 ...

  9. (十一)、head--查看文件前若干部分,tail--查看文件后若干部分

    一.命令描述与格式 head用于查看文件前面部分,tail用于查看文件的末尾部分 格式:head/tail    [-选项]   文件 head选项: -c:处理文件若干字节数,加b.k.m -n:前 ...

随机推荐

  1. POJ 1511 Invitation Cards (ZOJ 2008) 使用优先队列的dijkstra

    传送门: http://poj.org/problem?id=1511 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1008 ...

  2. 基于Android Fragment功能的样例

    通过近期空暇时候对Fragment的学习,尝试着写了一个小Demo,将在开发的时候能经常使用到的Fragment知识放在一起,写过了这个Demo对Android Fragment的了解更加深入了,以后 ...

  3. ModSecurity防御暴力破解

    http://www.modsecurity.org/ ModSecurity防御暴力破解 在阅读本文前,先简单了解下什么是ModSecurity,ModSecurity是一个入侵探测与阻止的引擎.它 ...

  4. thinkphp3.2.3 excel导出,下载文件,包含图片

    关于导出后出错的问题 https://segmentfault.com/q/1010000005330214 https://blog.csdn.net/ohmygirl/article/detail ...

  5. perl对比两个文件的行

    perl对比两个文件的行 对比两个文件的各行,得到A与B相同的行/A与B不相同的行 主要功能 得到相同行 得到A中包含,B不包含的行 得到B中包含,A中不包含的行 具体执行情况 Perl代码 #!/u ...

  6. 搭建基于java环境

    .net项目架构改造之搭建基于java环境配置一览[上]   最近公司做了一个项目,需要嵌套在千牛的客户端上,项目代码必须上阿里的聚石塔,全程采用基于docker的自动化部署,我们的项目是基于.net ...

  7. 【a702】贷款利率

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 当一个人从银行贷款后,在一段时间内他将不得不每月尝还固定的分期付款.这个问题要求计算机出贷款者向银行支付的利 ...

  8. iOS --- UIColor中使用16进制选取颜色

    iOS中的UIColor能够使用16进制来选取颜色. 预先定义例如以下: #define UIColorFromHex(s) [UIColor colorWithRed:(((s & 0xFF ...

  9. 小强的HTML5移动开发之路(53)——jQueryMobile页面间参数传递

    在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...

  10. 你的薪水增速跑赢GDP了没

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZm9ydW9r/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...