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

求助,C++中为什么有些函数只能用成员函数重载,而有些函数则只能用友元函数重载,其本质原因是什么?,第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百度贴吧,必成千秋霸业,建不世之功。

重载>>和<<通常都用友元函数,理由很简单。

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;

}

重载 *** 作符只要不违背其功能类型的限制,无论是成员函数还是普通或是友元函数都是可以的。只是在普通函数或者是友元中可以获得最大的灵活性和功能。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12185321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存