C++中的构造函数可以成为友元吗?

25

我们能够将一个类的构造函数声明为友元吗?我认为是不行的。但我在某个地方读到过可以这样做,但我无法实现。如果可以的话,你能否提供一些示例代码呢?


为什么不将整个类声明为友元呢? - wilx
2
@KarolyHorvath: 这通常是有用的,但你会显示什么在这里?friend <在这里填什么> ;?这对这个问题没有任何帮助。 - MSalters
@MSalters: 当然可以。它应该能够工作,所以OP的代码肯定存在特定的语法问题,或者可能是对友好性如何工作的误解。无论哪种方式,您都可以反映实际问题,而不仅仅是说“它应该能够工作”。 - Karoly Horvath
@KarolyHorvath:通常你会写 friend <函数名称>; 但是构造函数没有名称,所以我可以理解混淆的原因。 - MSalters
1个回答

29

可以的:

class Y
{
public:
     Y();
};
class X
{
private:
     void foo() {}  
     friend Y::Y();
};
Y::Y() 
{
   X x; x.foo(); 
}  

根据11.3 Friends [class.friend]

5) 当友元声明引用函数重载的名称或运算符时,只有由参数类型指定的函数成为友元。一个类X的成员函数可以是类Y的友元。

[ 例如:

class Y {
friend char* X::foo(int);
friend X::X(char); // constructors can be friends
friend X::~X(); // destructors can be friends
};

—结束示例]

(重点是我的)


1
这个是否有效?class Y { public: friend Y(int); }如果是,你会如何定义 Y(int) - Shreyas
3
这样做没有意义,一个类(或成员)怎么可能是它自己的朋友呢? - Luchian Grigore
class Y { friend class Y; }; 是有效但冗余的。同样适用于 class Y { Y(int); friend Y::Y(int); }; - jrok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接