表8.2流格式状态标志续表2.设置流格式状态标志的成员函数虽然无法直接对流格式状态标志进行操作,但可以使用ios类提供的公有成员函数来操作这些标志。例如,以下程序用成员函数setf设置ios∷left标志,用unsetf清除ios∷left设置:程序执行结果如下:默认对齐456.23456.23左对齐456.23456.23恢复默认齐456.23456.23采用setiosflags/resetiosflags操纵符是等价的。......
2023-11-07
C++使用流类库定义了4个标准流:cin、cout、cerr、clog。以实现数据流的输入与输出操作。在程序开始运行时,C++会自动打开这4个流,这些流是C++流类库的预定义流,如表8.1所示。
表8.1 C++流库的预定义流
C++的流通过重载运算符“<<”和“>>”执行输入和输出操作。输入操作是从流中提取一个字符序列,因此运算符“>>”也称为提取运算符。输出操作是向流中插入一个字
符序列,因此运算符“<<”称为插入运算符。
1.cout
cout是与标准输出设备连接的预定义输出流。C++的插入运算符“<<”向输出流发送字符。实际上,位于插入运算符右侧的字符串被存储在“<<”左侧的流中。例如:
cout<<fullname<<":"<<num<<'\n';
cout是数据的目的地,插入运算符“<<”把数据(字符串、数字或任何对象)传送到cout。cout一般连接到标准输出设备,即显示器(默认设备)。
可以把若干个插入运算符放在一个语句中完成几个输出操作。每个插入运算符都返回一个它调用的输出流,因为插入运算符“<<”是从左向右结合的,所以这个返回值被连续传送给每个插入运算符“<<”。所以上例等价于以下语句:
cout<<fullname;
cout<<":";
cout<<num;
cout<<'\n';
2.cin
cin是与标准输入设备连接的预定义输入流,称为源。它从输入流中取出数据,数据从输入提取运算符“>>”处流进程序。为了保留输入数据,输入语句要求有目的地址,即指定数据类型的存储单元,例如:
int num;
cin>>num;
这段代码所进行的操作是:提取运算符“>>”从cin参数中提取一个整型数据存入变量num。cin一般连接到标准输入设备即键盘(默认设备)。
每种内部类型都有内部定义的提取运算符,根据默认定义,内部类型的提取运算符跳过空格,然后为当前的类型读入适当的数据。例如:(www.chuimin.cn)
char name[20];
cin>>name;
如果从键盘输入“smith rose”,则只有“smith”被读取到name中,而“rose”将继续留在输入流缓冲区中,直到下次提取。
与插入运算符一样,也可以把多个提取运算符连在一条语句中,读取多个数据项。例如:
char name[20];
int age;
cin>>name>>age;
在此例中,如果给name输入的字符超过20个,则输入文本将溢出变量name的内存区域而覆盖变量age,甚至还可能覆盖程序的部分指令,这样就会破坏程序。所以,需要有一种方法将数组变量或指针变量的长度准确地告诉流,这就是格式化I/O。
3.cerr
cerr类似标准错误文件。cerr与cout的差别在于:
(1)cerr是不能重定向的;
(2)cerr不能被缓冲,它的输出总是直接传送到标准输出设备上。
错误信息是写到cerr的项。即使在各种其他输出语句中,如果使用下列语句,则错误信息“Error”总能保证在显示器上显示出来:
cerr<<"Error"<<"\n";
4.clog
clog是不能重定向的,但是可以被缓冲。在某些系统中,由于缓冲,使用clog代替cerr可以改进显示速度:
clog<<"Error"<<"\n";
有关C++程序设计基础教程的文章
表8.2流格式状态标志续表2.设置流格式状态标志的成员函数虽然无法直接对流格式状态标志进行操作,但可以使用ios类提供的公有成员函数来操作这些标志。例如,以下程序用成员函数setf设置ios∷left标志,用unsetf清除ios∷left设置:程序执行结果如下:默认对齐456.23456.23左对齐456.23456.23恢复默认齐456.23456.23采用setiosflags/resetiosflags操纵符是等价的。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
输入流是用流提取运算符实现的。流读取运算符通常会跳过输入流中的空格、tab键、换行符等等的空白字符。该函数读取num-1个字符后结束,或者遇到分隔符separator时结束。成员函数peek返回输入流中的下一个字符,但并不将其从输入流中删除。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。在类模板中,可以用类型参数名表示数据成员的类型,也可以表示成员函数返回值、形参和局部变量的类型。类模板定义中的类型参数可带默认值。说明以下类模板的功能。......
2023-11-07
同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。程序的一次执行如下:填充一个字符数组第1个数据:a↙第2个数据:b↙第3个数据:c↙第4个数据:d↙第5个数据:e↙数组的内容是:a b c d e填充一个双精度数组第1个数据:1.2↙第2个数据:5.6↙第3个数据:3.1↙数组的内容是:1.25.63.1图5.3类模板、模板类和对象之间的关系......
2023-11-07
内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。声明虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确地执行。如果不相同,则被派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。......
2023-11-07
虚函数总是在派生环境中使用,用虚函数实现动态多态性的一般步骤如下:在基类中定义虚函数;在派生类中定义与基类虚函数同名、同参数、同返回类型的成员函数,即派生类中的虚函数。分析以下程序的执行结果。图7.18类层次类BaseA包括虚函数bf(),类BaseB包括非虚函数bf(),类Derived是从类BaseA和类BaseB派生的,其中也包括函数bf()。解:设计的类层次如图7.2所示,普通函数printobject()采用动态绑定的方法。......
2023-11-07
相关推荐