求助,C++中为什么有些函数只能用成员函数重载,而有些函数则只能用友元函数重载,其本质原因是什么?

RT,我是个刚学C++的新手,麻烦讲的通俗些详细些,谢谢了~
2024-12-15 23:57:16
推荐回答(2个)
回答1:

你说的是操作符重载吧, 操作符重载函数,说白了还是一个成员函数。 和普通的成员函数调用一样。 我们知道,类的成员函数必须通过对象才可以调用,比如 [] 运算符。 
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百度贴吧,必成千秋霸业,建不世之功。

回答2:

可能与成员变量有关,成员函数与友元函数可访问的权限不同