C++中类public区声明的友元operator+为何不显示IDE补全?
为什么友元
operator+不会出现在IDE的对象成员补全里? 这是个很常见的误解,我来给你掰扯清楚:
首先,友元函数根本不是类的成员函数——不管你把友元声明写在类的public、protected还是private区块里,它都不属于这个类的成员体系。你在public里声明友元,只是让这个函数的声明在类的外部作用域可见,而不是把它变成类的公有成员。
回到你的代码:
class Graph { public: Graph()= default; friend Graph operator+ (const Graph &g1, const Graph &g2); };
这里的operator+是一个全局函数(除非你特意把它定义在某个命名空间里),它只是获得了访问Graph类内部私有/保护成员的权限而已。所以它的调用方式是g1 + g2,而不是g1.operator+(g2)——后者是成员运算符的调用语法。
IDE的补全列表在你输入g.的时候,只会显示Graph类的成员(成员变量、成员函数、成员类型等),全局的友元函数自然不会出现在这个列表里。这完全是正常现象,和函数是不是“公有”没有关系——它从一开始就不是类的成员,谈何公有私有?
如果想要让operator+出现在对象的补全列表里,你需要把它声明为类的成员函数,但注意成员形式的operator+只能是一元运算符,或者作为二元运算符时左操作数是当前类对象(且二元形式只需要一个参数),比如:
class Graph { public: Graph()= default; // 成员形式的operator+,左操作数是this指向的对象 Graph operator+ (const Graph &g2) const; };
这时候你输入g.,IDE就会补全这个operator+,调用的时候可以用g1 + g2或者g1.operator+(g2)两种方式。
总结一下:你的友元operator+本身没有问题,IDE的补全行为也是正确的——它只是不属于类的成员,所以不会出现在对象的成员补全里,直接用g1 + g2的方式调用就好。
内容的提问来源于stack exchange,提问作者user14068460
相关产品推荐
相关产品推荐

