📄 c++的iostream标准库介绍.htm
字号:
<BR><BR> 先说<STRONG><FONT
color=#ff0000>左移(<<)操作符</FONT></STRONG>,也就是我们<STRONG>常说的输出操作符</STRONG>。
<BR><BR> 对于自定义类来说,重载左移操作符的方法我们常使用类的友元方式进行操作。
<BR><BR> 示例代码如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9
border=1>
<TBODY>
<TR>
<TD><FONT color=#008000>//程序作者:管宁</FONT> <BR><FONT
color=#008000>//站点:www.cndev-lab.com</FONT> <BR><FONT
color=#008000>//所有稿件均有版权,如要转载,请务必著名出处和作者</FONT>
<BR><BR>#include<<FONT color=#800000>iostream</FONT>>
<BR><FONT color=#0000ff>using</FONT><FONT
color=#0000ff>namespace</FONT>std; <BR><BR><FONT
color=#0000ff>class</FONT>Test <BR>{ <BR><FONT
color=#0000ff>public</FONT>: <BR>Test(<FONT
color=#0000ff>int</FONT>age<FONT color=#ff0000>=</FONT>0,<FONT
color=#0000ff>char</FONT>*name<FONT
color=#ff0000>=</FONT>"\0") <BR>{ <BR>Test::age<FONT
color=#ff0000>=</FONT>age; <BR>strcpy(Test::name,name); <BR>}
<BR><FONT color=#0000ff>void</FONT>outmembers(<FONT
color=#800000>ostream</FONT>&out) <BR>{
<BR>out<<"Age:"<<age<<endl<<"Name:"<<<FONT
color=#0000ff>this</FONT>->name<<endl; <BR>}
<BR><FONT color=#0000ff>friend</FONT><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&,Test&); <BR><FONT
color=#0000ff>protected</FONT>: <BR><FONT
color=#0000ff>int</FONT>age; <BR><FONT
color=#0000ff>char</FONT>name[50]; <BR>}; <BR><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&out,Test&temp) <BR>{
<BR>temp.outmembers(out); <BR><FONT
color=#0000ff>return</FONT>out; <BR>} <BR><FONT
color=#0000ff>int</FONT><FONT color=#0000ff>main</FONT>()
<BR>{ <BR>Testa(24,"管宁"); <BR><FONT
color=#800000>cout</FONT><<a; <BR>system("pause");
<BR>}</TD></TR></TBODY></TABLE><BR> 上例代码中,我们对void
outmembers(ostream
&out)的参数使用ostream定义主要是为了可以向它传递任何ostream类对象不光是cout也可以是ofstrem或者是ostrstream和ostringstream类对象,做到通用性。
<BR>
<P>
<P>[!--empirenews.page--]C++的iostream标准库介绍(8)[/!--empirenews.page--]</P>
<P>重载运算符,我们知道可以是非成员方式也可以是成员方式的,对于<<来说同样也可以是成员方式,但我十分不推荐这么做,因为对于类的成员函数来说,第一个参数始终是会被隐藏的,而且一定是当前类类型的。
<BR><BR> 下面的示例代码就是将上面的<<重载函数修改成成员方式的做法:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9
border=1>
<TBODY>
<TR>
<TD><FONT color=#008000>//程序作者:管宁</FONT> <BR><FONT
color=#008000>//站点:www.cndev-lab.com</FONT> <BR><FONT
color=#008000>//所有稿件均有版权,如要转载,请务必著名出处和作者</FONT>
<BR><BR>#include<<FONT color=#800000>iostream</FONT>>
<BR><FONT color=#0000ff>using</FONT><FONT
color=#0000ff>namespace</FONT>std; <BR><BR><FONT
color=#0000ff>class</FONT>Test <BR>{ <BR><FONT
color=#0000ff>public</FONT>: <BR>Test(<FONT
color=#0000ff>int</FONT>age<FONT color=#ff0000>=</FONT>0,<FONT
color=#0000ff>char</FONT>*name<FONT
color=#ff0000>=</FONT>"\0") <BR>{ <BR>Test::age<FONT
color=#ff0000>=</FONT>age; <BR>strcpy(Test::name,name); <BR>}
<BR><FONT color=#0000ff>void</FONT>outmembers(<FONT
color=#800000>ostream</FONT>&out) <BR>{
<BR>out<<"Age:"<<age<<endl<<"Name:"<<<FONT
color=#0000ff>this</FONT>->name<<endl; <BR>}
<BR><FONT color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&out) <BR>{ <BR><FONT
color=#0000ff>this</FONT>->outmembers(out); <BR><FONT
color=#0000ff>return</FONT>out; <BR>} <BR><FONT
color=#0000ff>protected</FONT>: <BR><FONT
color=#0000ff>int</FONT>age; <BR><FONT
color=#0000ff>char</FONT>name[50]; <BR>}; <BR><FONT
color=#0000ff>int</FONT><FONT color=#0000ff>main</FONT>()
<BR>{ <BR>Testa(24,"管宁"); <BR>a<<<FONT
color=#800000>cout</FONT>; <BR>system("pause");
<BR>}</TD></TR></TBODY></TABLE><BR> 从代码实现上,我们将函数修改成了ostream&
operator <<(ostream
&out),迫不得已将ostream类型的引用参数放到了后面,这是因为,成员方式运算符重载函数第一个参数会被隐藏,而且一定是当前类类型的,这和ostream类型冲突了。由此我们在使用cout输出的时候就必须写成a<<cout;,这样一来代码的可读行就大大降低了,这到底是左移还是右移呢?为此我再一次说明,对于左移和右移运算符的重载是十分不推荐使用成员函数的方式编写的。
<BR><BR> 为了巩固学习,下面我们以fstream对象输出为例做一个练习。 <BR><BR> 代码如下: <BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9
border=1>
<TBODY>
<TR>
<TD><FONT color=#008000>//程序作者:管宁</FONT> <BR><FONT
color=#008000>//站点:www.cndev-lab.com</FONT> <BR><FONT
color=#008000>//所有稿件均有版权,如要转载,请务必著名出处和作者</FONT>
<BR>#include<<FONT color=#800000>iostream</FONT>>
<BR>#include<<FONT color=#800000>fstream</FONT>>
<BR><FONT color=#0000ff>using</FONT><FONT
color=#0000ff>namespace</FONT>std; <BR><BR><FONT
color=#0000ff>class</FONT>Test <BR>{ <BR><FONT
color=#0000ff>public</FONT>: <BR>Test(<FONT
color=#0000ff>int</FONT>age<FONT color=#ff0000>=</FONT>0,<FONT
color=#0000ff>char</FONT>*name<FONT
color=#ff0000>=</FONT>"\0") <BR>{ <BR>Test::age<FONT
color=#ff0000>=</FONT>age; <BR>strcpy(Test::name,name); <BR>}
<BR><FONT color=#0000ff>void</FONT>outmembers(<FONT
color=#800000>ostream</FONT>&out) <BR>{
<BR>out<<"Age:"<<age<<endl<<"Name:"<<<FONT
color=#0000ff>this</FONT>->name<<endl; <BR>}
<BR><FONT color=#0000ff>friend</FONT><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&,Test&); <BR><FONT
color=#0000ff>protected</FONT>: <BR><FONT
color=#0000ff>int</FONT>age; <BR><FONT
color=#0000ff>char</FONT>name[50]; <BR>}; <BR><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&out,Test&temp) <BR>{
<BR>temp.outmembers(out); <BR><FONT
color=#0000ff>return</FONT>out; <BR>} <BR><FONT
color=#0000ff>int</FONT><FONT color=#0000ff>main</FONT>()
<BR>{ <BR>Testa(24,"管宁"); <BR>ofstreammyfile("c:\\1.txt",<FONT
color=#800000>ios</FONT>::out,0); <BR><FONT
color=#0000ff>if</FONT>(myfile.rdstate()==ios_base::goodbit)
<BR>{ <BR>myfile<<a; <BR><FONT
color=#800000>cout</FONT><<"文件创建成功,写入正常!"<<endl;
<BR>} <BR><FONT
color=#0000ff>if</FONT>(myfile.rdstate()==ios_base::badbit)
<BR>{ <BR><FONT
color=#800000>cout</FONT><<"文件创建失败,磁盘错误!"<<endl;
<BR>} <BR>system("pause");
<BR>}</TD></TR></TBODY></TABLE><BR> 对于左移运算符重载函数来说,由于不推荐使用成员方式,那么使用非成员方式在类有多重继承的情况下,就不能使用虚函数进行左移运算符重载的区分,为了达到能够区分显示的目的,给每个类分别<STRONG><FONT
color=#ff0000>添加不同的虚函数</FONT></STRONG>是必要的。
<BR><BR> 示例代码如下:<BR><BR>
<TABLE borderColor=#cccccc width="90%" align=center bgColor=#e7e9e9
border=1>
<TBODY>
<TR>
<TD><FONT color=#008000>//程序作者:管宁</FONT> <BR><FONT
color=#008000>//站点:www.cndev-lab.com</FONT> <BR><FONT
color=#008000>//所有稿件均有版权,如要转载,请务必著名出处和作者</FONT>
<BR><BR>#include<<FONT color=#800000>iostream</FONT>>
<BR>#include<<FONT color=#800000>fstream</FONT>>
<BR><FONT color=#0000ff>using</FONT><FONT
color=#0000ff>namespace</FONT>std; <BR><BR><FONT
color=#0000ff>class</FONT>Student <BR>{ <BR><FONT
color=#0000ff>public</FONT>: <BR>Student(<FONT
color=#0000ff>int</FONT>age<FONT color=#ff0000>=</FONT>0,<FONT
color=#0000ff>char</FONT>*name<FONT
color=#ff0000>=</FONT>"\0") <BR>{ <BR>Student::age<FONT
color=#ff0000>=</FONT>age; <BR>strcpy(Student::name,name);
<BR>} <BR><FONT color=#0000ff>virtual</FONT><FONT
color=#0000ff>void</FONT>outmembers(<FONT
color=#800000>ostream</FONT>&out)<FONT
color=#ff0000>=</FONT>0; <BR><FONT
color=#0000ff>friend</FONT><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>operator</FONT><<(<FONT
color=#800000>ostream</FONT>&,Student&); <BR><FONT
color=#0000ff>protected</FONT>: <BR><FONT
color=#0000ff>int</FONT>age; <BR><FONT
color=#0000ff>char</FONT>name[50]; <BR>}; <BR><FONT
color=#800000>ostream</FONT>&<FONT
color=#0000ff>oper
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -