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:前 ...
随机推荐
- 【3002】删去K个数字
Time Limit: 3 second Memory Limit: 2 MB [问题描述] 输入一个数字串S和整数K(K小于数字串S的长度),从S中删去K个数字,使剩余数字在保持相对位置不变的情况下 ...
- Your algorithm's runtime complexity must be in the order of O(log n).
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- [Angular2 Router] Get activated router url
getActivatedRoutePath(r: ActivatedRoute) { return r.url .subscribe(p => this.curtPath = p[0].path ...
- Android 各个版本号WebView
转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 依据Googl ...
- ios开发多线程一:了解-NSOperation的基本使用
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- C运行时库(C Run-time Library)详解(提供的另一个最重要的功能是为应用程序添加启动函数。Visual C++对控制台程序默认使用单线程的静态链接库,而MFC中的CFile类已暗藏了多线程)
一.什么是C运行时库 1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数. 2)C 语言是所谓的“ ...
- js课程 1-3 Javascript变量类型详解
js课程 1-3 Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...
- 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名
刚接触JNI 的 兄弟在看一些demo的时候 发现有类似与“([Ljava/lang/String;)V”的东西的时候肯定会很“蛋疼”,完全不懂这是啥东西,怎么来的,有啥用处? 今天就讲讲这个“蛋疼” ...
- springMVC中前台ajax传json数据后台controller接受对象为null
在jquery的ajax中,如果没加contentType:"application/json",那么data就应该对应的是json对象,反之,如果加了contentType:&q ...
- phpstorm常用快捷键有哪些(图解归类)
phpstorm常用快捷键有哪些(图解归类) 一.总结 一句话总结: 10.方法参数提示,显示默认参数 解答:--------CTRL+P 13.显示类层级关系图,继承/实现关系 解答:--- ...