操作符重载函数默认就是友元函数吗?

yjukh 2010-10-23 04:15:53
在对一个操作符进行重载时,没有将它声明成友元,但它还是可以访问私有的成员变量,难道它默认就是友元函数?
我用的是VS2005,这段代码编码和运行都没有问题



class SPoint
{
private:
float data[3];
public:

SPoint():
{
memset(data,0, 3*sizeof(float));
}

SPoint(float x,float y,float z):
{
data[0] = x;
data[1] = y;
data[2] = z;

}
SPoint(const SPoint &pt):
{
memcpy(data,pt.data,3*sizeof(float));

}

void operator =(const SPoint &pt)
{
memcpy(data,pt.data,3*sizeof(float));
}


inline SPoint operator +( const SPoint &p2);//-----没有声明为友元

} ;

SPoint inline SPoint::operator +(const SPoint &p2)
{
SPoint sp;
for(int i=0;i<3;i++)
sp.data[i] = data[i] + p2.data[i];//-------但sp和p2都可以访问data私有变量!
return sp;
}


...全文
159 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
明月生寒 2010-11-04
  • 打赏
  • 举报
回复
函数定义在public下面 肯定是成员函数 不信你定义在public上面不声明为友元函数试试 肯定就不能访问私有数据成员了
cxxer 2010-10-23
  • 打赏
  • 举报
回复
楼主程序是operator+是成员函数,而不是楼主所言的非成员友元函数。
类成员可以访问类的私有成员变量,p2是SPoint类。
yjukh 2010-10-23
  • 打赏
  • 举报
回复
即使重载函数是成员函数,但p2作为形参怎么也可以访问自己的私有变量呢?
gules 2010-10-23
  • 打赏
  • 举报
回复
呵呵,对友元到是记得清楚,却把成员函数抛到九宵云外去了,还不如用C呢!
明月生寒 2010-10-23
  • 打赏
  • 举报
回复
inline SPoint operator +( const SPoint &p2);//-----没有声明为友元

这个都已经定义为成员函数了 当然可以调用私有变量 如果你想看看没有声明的效果 把这个函数写到类外边去
chainyu 2010-10-23
  • 打赏
  • 举报
回复
SPoint inline SPoint::operator +(const SPoint &p2)
这句的::已经表明+操作符是类SPoint的成员函数了。建议LZ多看几遍书加深理解
vcgaoshou 2010-10-23
  • 打赏
  • 举报
回复
运算符重载函数重载成成员函数了,当然在该函数内可以经对象,使用"."运算符访问私用成员了
hukui161 2010-10-23
  • 打赏
  • 举报
回复
倒了。
黑娃 2010-10-23
  • 打赏
  • 举报
回复
你定义的重载函数是共有的,当然能作为成员函数去访问它的私有成员啦
liutengfeigo 2010-10-23
  • 打赏
  • 举报
回复
成员函数不可以访问私有成员的话,那该怎么扯出来呢。
还有就是,成员函数不是对象所有
cheng_fengming 2010-10-23
  • 打赏
  • 举报
回复
晕,你都把重载函数作为类的成员函数了,它当然可以访问类的私有成员的。
试想,类方法如果不能访问自己的类成员,那还有谁能访问呢
你把操作符重载写成一般函数看看,肯定访问不了了,当然友元函数是可以的。
liutengfeigo 2010-10-23
  • 打赏
  • 举报
回复
倒~!~你没理解清楚吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧