友元基本概念:
friend关键字只出现在声明处,一个函数或者类 作为了另一个类的友元 那么这个函数或类就可以直接访问另一个类的私有数据。
运算符重载:
语法:定义重载的运算符就像定义函数,只是该函数的名字是operator@,这里的@代表了被重载的运算符 (例: operator<< ) 思路:1、识别运算符左边的是不是自己定义的类的运算对象 类的对象:推荐使用成员函数实现 (因为可以使用this ,可以少一个形参),当然也可用全局 其他:只能使用全局函数实现 2、判断形参个数
以下是样例
#include <iostream>
#include <string>
using namespace std;
class Person
{
friend ostream& operator<<(ostream &out, Person ob);
friend istream& operator>>(istream &in, Person &ob);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name,float score):num(num),name(name),score(score){}
//成员函数重载+运算符
Person operator+(Person &ob)
{
Person tmp;
tmp.num = num+ob.num;
tmp.name = name+ob.name;
tmp.score = score+ob.score;
return tmp;
}
//成员函数重载==运算符
bool operator==(Person &ob)
{
if(num==ob.num && name==ob.name && score==ob.score)
return true;
return false;
}
};
//全局函数重载operator<<
ostream& operator<<(ostream &out, Person ob)
{
out<<ob.num<<" "<<ob.name<<" "<<ob.score<<endl;
return out;
}
//全局函数重载operator>>
istream& operator>>(istream &in, Person &ob)
{
in>>ob.num>>ob.name>>ob.score;
return in;
}
int main(int argc, char *argv[])
{
Person lucy(100,"lucy", 88.8);
Person bob(100,"lucy",88.8);
if(lucy == bob)
{
cout<<"相等"<<endl;
}
else
{
cout<<"不相等"<<endl;
}
return 0;
}
重载++ — 运算符
重载的++和–运算符有点让人不知所措,因为我们总是希望能根据它们出现在所作用对象的前面还是后
面来调用不同的函数。解决办法很简单,例如当编译器看到++a(前置++),它就调用operator++(a),当编
译器看到a++(后置++),它就会去调用operator++(a,int).
++a(前置++),它就调用operator++(a),
a++(后置++),它就会去调用operator++(a,int)
–a(前置–),它就调用operator–(a),
a–(后置–),它就会去调用operator–(a,int)
友元使用中需要注意的问题:
1、友元关系不能被继承。
2.友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
3.友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友
以下是一个样例:整个类作为另一个类的友元
<strong>class Room; // 向前声明 只能说明类名称</strong>,
class goodGay
{
public:
void visiting01(Room &room);<strong> //向前声明是为了这里不报错</strong>
void visiting02(Room &room);
};
class Room
{
friend class goodGay;
private:
string bedRoom; // 卧室
public:
string setingRoom; // 客厅
public:
Room(string bedRoom, string setingRoom)
{
this->bedRoom = bedRoom;
this->setingRoom = setingRoom;
}
};
<strong>void goodGay::visiting01(Room &room)</strong> /<strong>/这个函数要在全局实现,与上述同理</strong>
{
cout << "访问了" << room.setingRoom << endl;
cout << "访问了" << room.bedRoom << endl;
}
void goodGay::visiting02(Room &room)/<strong>/这个函数要在全局实现,与上述同理</strong>
{
cout << "好基友访问了" << room.setingRoom << endl;
cout << "好基友访问了" << room.bedRoom << endl;
}
int main(int argc, char *argv[])
{
Room room("卧室", "客厅");
goodGay ob;
ob.visiting01(room);
ob.visiting02(room);
return 0;
}
标签:友元,name,Person,++,ob,运算符,重载,num,operator
From: https://blog.51cto.com/u_14882565/9242849