C++重载输出操作符
2015-07-17 09:46
357 查看
说明:这里要声明成友元函数的原因是,为类重载运算符<<时,该重载运算符函数不是成员函数,不能直接访问DataInfo类的私有成员dataInfo.name等,所以需要用友元函数。因为不是成员函数,所以不需要DataInfo::限定符,不能用成员运算符来调用。
调用:
DataInfo dataInfo;
cout<<dataInfo;
上面重载运算符<<第一个是ostream类对象(cout),如果使用一个 DataInfo 成员函数来重载<<,DataInfo 对象将是第一个操作数,就意味着必须这样用:
dataInfo<<cout;使用友元函数,可以像下面这样重载:
void operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
out << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
}该operator<<()定义使用ostream引用out作为它的第一个参数。通常情况下,out引用cout对象,如表达式cout<<dataInfo所示。但也可以将这个运算符用于其他ostream对象,这种情况下,out将引用相应的对象。
问题:cout<<dataInfo;语句可以正常工作,但下面的语句不能正常工作:
cout<<"dataInfo"<<dataInfo<<endl;
所以函数需要返回ostream的对象cout,故采用下面的方式:
ostream& operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
cout << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
return out;
}
//记录信息类型
class DataInfo
{
public:
DataInfo();//默认构造函数
friend ostream& operator<<(ostream& out, const DataInfo& dataInfo); //重载输出操作符
//friend class HashTable;
//private:
string name;//姓名
string phone;//电话号码
string address;//地址
};
DataInfo::DataInfo() :name(""), phone(""), address("")
{
}
ostream& operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
cout << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
return out;
}
调用:
DataInfo dataInfo;
cout<<dataInfo;
上面重载运算符<<第一个是ostream类对象(cout),如果使用一个 DataInfo 成员函数来重载<<,DataInfo 对象将是第一个操作数,就意味着必须这样用:
dataInfo<<cout;使用友元函数,可以像下面这样重载:
void operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
out << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
}该operator<<()定义使用ostream引用out作为它的第一个参数。通常情况下,out引用cout对象,如表达式cout<<dataInfo所示。但也可以将这个运算符用于其他ostream对象,这种情况下,out将引用相应的对象。
问题:cout<<dataInfo;语句可以正常工作,但下面的语句不能正常工作:
cout<<"dataInfo"<<dataInfo<<endl;
所以函数需要返回ostream的对象cout,故采用下面的方式:
ostream& operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
cout << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
return out;
}
//记录信息类型
class DataInfo
{
public:
DataInfo();//默认构造函数
friend ostream& operator<<(ostream& out, const DataInfo& dataInfo); //重载输出操作符
//friend class HashTable;
//private:
string name;//姓名
string phone;//电话号码
string address;//地址
};
DataInfo::DataInfo() :name(""), phone(""), address("")
{
}
ostream& operator<<(ostream& out, const DataInfo& dataInfo) //重载输出操作符
{
cout << "姓名:" << dataInfo.name << " 电话:" << dataInfo.phone
<< " 地址:" << dataInfo.address << endl;
return out;
}
相关文章推荐
- 浅谈C++多态性
- CodeForces 548C
- 对C++多态性的一点理解
- C语言位运算符及作用:与、或、异或、取反、左移和右移
- C++多态解释与例子
- log4cxx配置使用(一)
- iOS C语言5_二维数组
- 黑马程序员------C语言中对形参和实参的理解
- 如果是初学C语言请看完 一些成功人士的心得 (转自程先的专栏)
- VS2013的Visual C++ 项目如何修改目标框架和平台工具集
- c++使用stmp协议发送电子邮件(163邮箱,TTL非SSL)
- C语言 指针总结(复习)
- C++ 类初探
- 关于C++中String类型的使用
- c语言结构体赋值,并输出各种类型变量的值
- C++类构造函数的初始化列表
- Max Sum
- C语言基础3
- c++11 多线程 -- 基本使用
- 顺利运行BarTender 10.1之前必安装Visual C++ 2008