友元函数
使用规则
- 在类(结构体)中需要定义友元函数的原型(前面加friend)
- friend只能在友元函数的原型加,不能在友元函数的实现部分加friend
- 尽管友元函数的原型在类中定义,但不能像调用类成员方法一样调用友元函数
实现
类中定义的操作符函数自定义数据类型默认放在左边,
MyClass operator*(int right)
{
return MyClass(mValue * right);
}
如果想要实现MyClass operator*(int left, MyClass right),就可以使用友元函数,实现如下:
#include <iostream>
using namespace std;
class MyClass
{
private:
int mValue;
public:
MyClass(int value)
{
mValue = value;
}
void print()
{
cout << mValue << endl;
}
// MyClass * xxxx
MyClass operator*(int right)
{
return MyClass(mValue * right);
}
friend MyClass operator*(int, MyClass);
friend void process();
};
MyClass operator*(int left, MyClass right)
{
return left * right.mValue;//MyClass(left * right.mValue);
}
void process()
{
}
使用
int main(int argc, const char * argv[]) {
MyClass result = 20 * MyClass(30) ;
result.print();
return 0;
}
友元函数<<操作符重载
定义一个类:
class MyClass
{
private:
int mValue;
public:
MyClass(int value)
{
mValue = value;
}
};
没有getValue函数,但是想要输出mValue的值,可以使用友元函数<<操作符重载
“<<”在操作符中表示左移两位,还有一种用法用于“cont << ”,可以借助“cont << ”实现mValue 的输出
class MyClass
{
private:
int mValue;
public:
MyClass(int value)
{
mValue = value;
}
friend void operator<<(ostream &os, MyClass &myClass);
friend ostream& operator<<(ostream &os, MyClass &myClass);
};
void operator<<(ostream &os, MyClass &myClass)
{
return os << myClass.mValue;
}
使用:
MyClass myClass(20);
cout << myClass ;
但是一般使用cont<<, 都使用<<endl换行,如何实现呢?
class MyClass
{
private:
int mValue;
public:
MyClass(int value)
{
mValue = value;
}
friend ostream& operator<<(ostream &os, MyClass &myClass);
};
ostream& operator<<(ostream &os, MyClass &myClass)
{
return os << myClass.mValue;
}
将函数返回值设置为ostream&,就可以实现连续输出
MyClass myClass(20);
cout << myClass << "abc" << endl;