| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
C++的iostream标准库介绍以及对左移与右移运算符的重载
作者:佚名    文章来源:网络    点击数:    更新时间:2006-9-12
 

 通过上面内容的学习,我们对i/o有了一些基本点基本的认识,现在是该切入正题的时候了,详细学习一下,如何重载左移与右移操作符。

  先说左移(<<)操作符,也就是我们常说的输出操作符
  对于自定义类来说,重载左移操作符的方法我们常使用类的友元方式进行操作。

示例代码如下:

 C++ 代码
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int age = 0,char *name = "\0")
{
Test::age = age;
strcpy(Test::name,name);
}
void outmembers(ostream &out)
{
out<<"Age:"<this->name< }
friend ostream& operator <<(ostream& ,Test&);
protected:
int age;
char name[50];
};
ostream& operator <<(ostream& out,Test &temp)
{
temp.outmembers(out);
return out;
}
int main()
{
Test a(24,"管宁");
cout< system("pause");
}


  上例代码中,我们对void outmembers(ostream &out)的参数使用ostream定义主要是为了可以向它传递任何ostream类对象不光是cout也可以是ofstrem或者是ostrstream和ostringstream类对象,做到通用性。

  重载运算符,我们知道可以是非成员方式也可以是成员方式的,对于<<来说同样也可以是成员方式,但我十分不推荐这么做,因为对于类的成员函数来说,第一个参数始终是会被隐藏的,而且一定是当前类类型的。

  下面的示例代码就是将上面的<<重载函数修改成成员方式的做法:

 C++ 代码
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
using namespace std;

class Test
{
public:
Test(int age = 0,char *name = "\0")
{
Test::age = age;
strcpy(Test::name,name);
}
void outmembers(ostream &out)
{
out<<"Age:"<this->name< }
ostream& operator <<(ostream &out)
{
this->outmembers(out);
return out;
}
protected:
int age;
char name[50];
};
int main()
{
Test a(24,"管宁");
a<<cout;
system("pause");
}


  从代码实现上,我们将函数修改成了ostream& operator <<(ostream &out),迫不得已将ostream类型的引用参数放到了后面,这是因为,成员方式运算符重载函数第一个参数会被隐藏,而且一定是当前类类型的,这和ostream类型冲突了。由此我们在使用cout输出的时候就必须写成a<
  为了巩固学习,下面我们以fstream对象输出为例做一个练习。

代码如下:
 C++ 代码
//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <fstream>
using namespace std;

class Test
{
public:
Test(int age = 0,char *name = "\0")
{
Test::age = age;
strcpy(Test::name,name);
}
void outmembers(ostream &out)
{
out<<"Age:"<this->name< }
friend ostream& operator <<(ostream& ,Test&);
protected:
int age;
char name[50];
};
ostream& operator <<(ostream& out,Test &temp)
{
temp.outmembers(out);
return out;
}
int main()
{
Test a(24,"管宁");
ofstream myfile("c:\\1.txt",ios::out,0);
if (myfile.rdstate() == ios_base::goodbit)
{
myfile< cout<<"文件创建成功,写入正常!"< }
if (myfile.rdstate() == ios_base::badbit)
{
cout<<"文件创建失败,磁盘错误!"< }
system("pause");
}
对于左移运算符重载函数来说,由于不推荐使用成员方式,那么使用非成员方式在类有多重继承的情况下,就不能使用虚函数进行左移运算符重载的区分,为了达到能够区分显示的目的,给每个类分别添加不同的虚函数是必要的。

示例代码如下:

 C++ 代码

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
#include <fstream>
using namespace std;

class Student
{
public:
Student(int age = 0,char *name = "\0")
{
Student::age = age;
strcpy(Student::name,name);
}
virtual void outmembers(ostream &out) = 0;
friend ostream& operator <<(ostream& ,Student&);
protected:
int age;
char name[50];
};
ostream& operator <<(ostream& out,Student &temp)
{
temp.outmembers(out);
return out;
}
class Academician:public Student
{
public:
Academician(int age = 0,char *name = "\0",char *speciality="\0"):Student(age,name)
{
strcpy(Academician::speciality,speciality);
}
&

上一页  [1] [2] [3] [4] [5] [6] 


相关文章