以下是一个对ostream的<<运算符的重载,
#include <iostream>
using namespace std;
class Point {
private:
int x;
int y;
public:
Point() { };
// 在此处补充你的代码 //这里因为iostream中输入输出流的类已经在别的地方定义了
//所以这里的运算符重载相当于全局函数,同时也要访问private的值就声明为友元函数,并不是方法
//主义因为这里的运算符重载就是多写了一个函数,那么这里重载函数的参数因为运算符是双目晕算符而是有两个参数
//当重载符号函数是方法时则参数是运算符目数减一(去掉自己) !!!千万注意这个问题!
friend istream& operator>>( istream& i,Point& p){
cin>>p.x>>p.y;
return i;
}
friend ostream& operator<<(ostream &o,const Point &p){
cout<<p.x<<","<<p.y;//这里注意 因为iostream作为一个类 其对象无法进行复制,所以这里一切函数对输入输出流作为参数时都要使用引用,否则出错
return o;
}
};
int main()
{
Point p;
while(cin >> p) {
cout << p << endl;
}
return 0;
}
这是对强制类型转换运算符重载:
在c++中,不仅可以对基本数据类型进行强制类型转换,类名称本身也是一种数据类型,那么强制类型转换也可以实现。
#include <iostream>
using namespace std;
class MyInt
{
int nVal;
public:
MyInt( int n) { nVal = n ;}
MyInt & operator-(const int &i){
nVal-=i;
return *this;
}
operator int(){
return nVal;
}//重载强制类型转换运算符时,不需要指定返回值类型,因为返回值类型是确定的,就是运算符本身代表的类型
//要记住类型名字本身也是一种类型名,比如这里的MyInt也可以进行强制类型转换,
};
int Inc(int n) {
return n + 1;
}
int main () {
int n;
while(cin >>n) {
MyInt objInt(n);
objInt-2-1-3;
cout << Inc(objInt);//这里编译时自动进行匹配,不满足就看是否可以进行类型转换。也就是上面operator int()的作用。
cout <<",";
objInt-2-1;
cout << Inc(objInt) << endl;
}
return 0;
}
#include <iostream>
using namespace std;
class MyCin
{
// 在此处补充你的代码
public:
bool flag;
MyCin():flag(true){}
operator bool()
{
return flag;
}//warning, the compulsory type convert function don't have a return type!
//在c++内部,类型的名字(包括自定义的类)都属于强制类型转换运算符,也就是说所有的类型名都是一种运算符,那么在定义类的时候就可以
//写强制类型转换函数,在碰到可能使用类型转换的地方就进行强制转换。
MyCin& operator>>(int &n)//这里参数类型只能是引用,否则之后是无法连续调用>>的!只能改变作为返回值传回的副本。
{
if(flag&&cin>>n&&n!=-1)
flag=true;
else flag=false;
return *this;
}
};
int main()
{
MyCin m;
int n1,n2;
while( m >> n1 >> n2)
cout << n1 << " " << n2 << endl;
return 0;
}