类内定义的友元算术运算符重载函数是否属于类成员?
问题解答
是的,这个operator+确实不属于Cents类的成员函数,而且所有在类内定义的友元函数都不属于该类的成员,和是不是运算符重载完全无关。
核心原因:友元的本质是「权限授予」,而非「成员声明」
friend关键字的唯一作用,是给外部函数/类开个「后门」,允许它访问当前类的私有/保护成员,并不会把这个函数变成类的一部分。不管友元函数的定义写在类内还是类外,它的身份都是全局函数(或所在命名空间的函数),而非类成员。
类内定义友元的特殊处理
虽然代码写在类的大括号里,但编译器会把这类友元函数当作「在类作用域外部定义的全局函数」处理——只是借类的位置完成了声明+定义的合并,同时自动获得友元权限而已。
怎么区分是不是成员函数?
成员函数会隐含一个this指针参数,用来指向调用它的对象;而友元函数没有这个隐含参数。比如这个operator+的参数是两个const Cents&,完全是全局函数的签名;如果是成员函数版的operator+,应该只需要一个参数(另一个操作数通过this访问)。
你还可以通过代码验证:尝试用Cents::operator+去调用这个函数,编译器会直接报错,因为它根本不是Cents类的成员;而直接用cents1 + cents2或者operator+(cents1, cents2)调用,完全符合全局函数的调用规则。
内容的提问来源于stack exchange,提问作者james dilaw
相关产品推荐
相关产品推荐

