我估计是要重载流输出运算符<<,比如cout<<a;原来的形式是 operator<<(cout,a); 由于<<需要用到两个类,一个是ostream类,cout就是他的对象,是负责输出的类;另一个是用户自定义类。
所以重载是应该用 友元函数 重载。如下:
#include <iostream>
using namespace std;
class Date
{
friend ostream& operator<<(ostream&,const Date&);
int year;
int month;
int day;
public:
Date() {year=2013; month=9; day=30;}
};
ostream& operator<<(ostream& out,const Date& date)
{
out<<date.year<<'-'<<date.month<<'-'<<date.day;
return out;
}
int main()
{
Date date;
cout<<date<<endl;
system("pause");
}
注意上面的ostream& operator<<(ostream& out,const Date& date)的3个引用&,
1. 第一个ostream&,返回的是ostream类对象的引用,为了进行连续的运算,如cout<<a<<b;
先进行cout<<a,运算玩了,返回cout的引用,就是返回了cout本身,原来的式子变为cout<<b;
这样就能连续写了,cout<<a<<b<<c<<........
2. 第二个ostream& out, out是随便取的名字,就是ostream类的对象,与cout用法一样,通过<<将数据传到out里,所以输出时用cout<<a,这时就调用 operator<<(cout,a), 把cout作为参数传入。对于上述例子cout<<date<<endl;,就是执行了cout<<date.year<<'-'<<date.month<<'-'<<date.day; return cout;(注意,这里就是cout,其中year等是基本类型,c++已经写好了)
再次说明cout并不特殊,就是预先定义好了的ostream类的对象。
3. 第三个const Date&,主要为了快速出入参数,如果不用&,将会复制一个参数,而不是将原来的对象直接传入,就会调用拷贝构造函数(如果没写的话编译器自动提供),浪费时间,有时还会产生错误,比如数据成员里有指针时,编译器提供的拷贝构造函数将会自动复制 一个指针,与原来的指针指向同一个地址,这样改变一个另一个也会改变,这是我们不想要的,我们需要拷贝时指针指向不同的地址,两个对象互不干扰,只是指针所指变量的值相等就行,这就需要自己写 拷贝构造函数,自己new等。 所以一般用&,加const防止意外修改。
// 这个例子将字符串左移n位,然后左面补空格
using namespace std;
class BitString
{
public:
BitString(char *str);
const char* operator<<(int bit);
private:
char m_str[200];
};
BitString::BitString(char *str)
{
strcpy(m_str, str);
}
const char* BitString::operator<<(int bit)
{
int len = strlen(m_str);
if(bit >= len)
{// 如果左移超过字符串长度,则直接至为空格即可
for(int i = 0; i < len; ++i)
{
m_str[i] = ' ';
}
return m_str;
}
// 先左移字符串
for(int i = 0; i < len - bit; ++i)
{
m_str[i] = m_str[i + bit];
}
for(int i = len - bit; i < len; ++i)
{
m_str[i] = ' ';
}
return m_str;
}
int main( void )
{
BitString bs("哈哈哈123456");
bs<<4;
system("pause");
}
complex operator+(complex c1,complex c2)
{return complex(c2.real+c1.real,c2.imag+c1.imag);}
要是定义“+”为复数类的成员函数这样定义:
complex operator+(complex c)
{return complex(real+c.real,imag+c.imag);}