你说的是 *** 作符重载吧, *** 作符重载函数,说白了还是一个成员函数。 和普通的成员函数调用一样。 我们知道,类的成员函数必须通过对象才可以调用,比如 [] 运算符。
class test{
public:
int operator[](int pos);
};
要调用 [] 运算符重载成员函数,必须有一个test的对象,否则就没法调用它啦。所以它必须是成员函数。
有一些运算符即可以友元,也可以用成员函数,比如 +
class test{
public:
test& operator+(const test& o_o); //这样定义成成员函数,就有test的对象来调用。
friend test& operator+(test& , const test &); //用友元,就是 *** 作两个test的对象。
};
有些运算符因为有特殊的要求,必须用友元。比如 string类。当你定义一个string对象时,可以用。
string str = "test";
string ok = "testtest" + str; //这样的运算符必须是友元,因为它的第一个参数是char 类型,相当于调用 operator (char , string str) //
string oook = str + "testset"; //这个就必须是成员函数,因为第一个str+ 表示调用str的成员函数operator+(char )
观楼主英俊潇洒,风流倜傥,必当世豪杰,大侠闲暇之余,关注0x30百度贴吧,必成千秋霸业,建不世之功。
重载>>和<<通常都用友元函数,理由很简单。
1、如何使用>>或<<呢
假如有类CLS
cls,该类有私有数据成员int
a。现在要读入数据a,如何调用呢?
cin
>>
clsa;
//显然不行,因为不能存取私有成员。
cin
>>
clas;
//
不行,编译程序会说没有>>的重载
2、使用友元函数时,就可以存取私有成员了。
istream
&operator>>(istream
&in,
CLS
&cls)
{
in
>>
clsa;
//
return
in;
}
调用方法:
cin
>>
cls;
之所以返回istream的引用,是为了可以连续输入cls的值值,如
CLS
clsa,clsb;
cin
>>
clsa
>>
clsb;
谁说不能?
#include<iostream>
using namespace std;
class a
{
private:
int age;
public:
inline int getAge(){return age;}
bool operator<<(const int x);
};
bool a::operator<<(const int x)
{
this->age=x;
return 1;
}
int main ()
{
a plor;
int b=21;
plor<<b;
cout<<plorgetAge()<<endl;
cinget();
return 0;
}
重载 *** 作符只要不违背其功能类型的限制,无论是成员函数还是普通或是友元函数都是可以的。只是在普通函数或者是友元中可以获得最大的灵活性和功能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)