C++ Primer Plus的若干收获--(十一)
本篇主要讲了转换函数的利与弊以及简要介绍流与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的若干收获--(十一)的更多相关文章
- C++ Primer Plus的若干收获--(二)
哎,真是不想吐槽考驾照的艰辛历程了.跑到大西郊,顶着大太阳,一天就能摸上个十几分钟二十分钟的车,简直不要太坑爹,这两天真是做的我屁股疼的不行. .. 今天果断不去了.仅仅可惜我的大阿根廷啊,坚持到最后 ...
- C++ Primer Plus的若干收获--(九)
这篇博文我接着上一篇来写,相同讲一些关于类的一些基础知识. 本篇将会继续使用上篇的股票类STock,这里给出接口 ifndef STOCKOO_H_ #define STOCKOO_H_ #inclu ...
- C++ Primer Plus的若干收获--(三)
有时候怀疑真是怀疑自己走的路究竟是不是正确的.作为一个土生土长数学系学生,却对数学毫无兴趣,没事的时候就喜欢躲在图书馆看看有关计算机的书.有时候期末考试时候会挂个一两门的数学专业课,有时候真希望数学课 ...
- 学习C++ Primer 的个人理解(十一)
关联容器 就像是个字典, 其元素是 键 - 值 对. 关键字起到索引作用. 有序: map:关联数组:保存 健-值 对 set : 关键字既是值. multimap : 关键字可重复出现的map mu ...
- C primer plus 读书笔记第十一章
本章标题是字符串和字符串函数.主要是了解和字符串有关的函数. 1.字符串表示和字符串I/O 主要内容:字符串常量和字符串数组的初始化,对比了指针和字符串. 其中要注意的是,数组初始化是从静态存储区把一 ...
- C++ Primer Plus学习:第十一章
运算符重载 使用方法: 在类的声明中定义重载运算符 datatype operator操作符(datatype); 定义:datatype classname:: operator操作符(dataty ...
- C Primer Plus学习笔记(十一)- 存储类别、链接和内存管理
存储类别 从硬件方面来看,被储存的每个值都占用一定的物理内存,C 语言把这样的一块内存称为对象(object) 对象可以储存一个或多个值.一个对象可能并未储存实际的值,但是它在储存适当的值时一定具有相 ...
- C语言培训第一天
下面是一些命令,先来谈谈今天的若干收获吧! 计算机中的一切文件都是以二进制补码的形式存在,问题也就来了. 第一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?(似乎问题和上 ...
- (十一)、head--查看文件前若干部分,tail--查看文件后若干部分
一.命令描述与格式 head用于查看文件前面部分,tail用于查看文件的末尾部分 格式:head/tail [-选项] 文件 head选项: -c:处理文件若干字节数,加b.k.m -n:前 ...
随机推荐
- js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功)
js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功) 一.总结 一句话总结:event的result属性即可. 1.event的result属性的实际应用场景是什么? ...
- thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片)
thinkphp5项目--企业单车网站(八)(文章板块要点)(删除图片) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise ...
- [D3] Load and Inspect Data with D3 v4
You probably use a framework or standalone library to load data into your apps, but what if that’s o ...
- Android 为开发者准备的最佳 Android 函数库(2016 年版)
本文是翻译自 CloudRAIL 的官方博客(https://cloudrail.com/best-android-libraries-for-developers/),本文中分享的 Android ...
- android,安卓get请求的提交以及我遇到的异常
首先说明 我是安卓4.0以上的版本,这个时候直接用网上的代码会报错的,先赋上网上的普遍代码 String uri = "http://url"; HttpGet httpGet = ...
- event.relatedTarget、event.fromElement、event.toElement
在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target来访问,相关元素通过event.relatedTarget属性来访问.event.relatedTarg ...
- sourceinsight4
转载 http://bbs.pediy.com/thread-215669.htm 如果你觉得软件有用,请购买正版.发布这个纯属娱乐. 转载请注明出处,谢谢! 仅修改了程序中用于License签名验证 ...
- 文件流结尾的EOF详解
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- Java8学习之旅2---基于Lambda的JDBC编程
Java8的Lambda表达式确实是一个很好的特性.可是在哪些场合下使用.事实上还是须要细致考虑的.我们当然不能为了使用而使用,而是须要找到切实实用的场合.在JDBC编程中,比如查询语句,首先须要进行 ...
- php课程 4-14 数组如何定义使用
php课程 4-14 数组如何定义使用 一.总结 1.各种语言键值对取值和赋值赋值表达式左边的特点是什么? 键值对,用于取值和赋值,取值和赋值的左边都是一样的 2.各种语言键值对取值或者赋值的时候如 ...