User talk:Subhankar roy99

Friend scope (C++ only)

The name of a friend function or class first introduced in a friend declaration is not in the scope of the class granting friendship (also called the enclosing class) and is not a member of the class granting friendship.

The name of a function first introduced in a friend declaration is in the scope of the first nonclass scope that contains the enclosing class. The body of a function provided in a friend declaration is handled in the same way as a member function defined within a class. Processing of the definition does not start until the end of the outermost enclosing class. In addition, unqualified names in the body of the function definition are searched for starting from the class containing the function definition.

If the name of a friend class has been introduced before the friend declaration, the compiler searches for a class name that matches the name of the friend class beginning at the scope of the friend declaration. If the declaration of a nested class is followed by the declaration of a friend class with the same name, the nested class is a friend of the enclosing class.

The scope of a friend class name is the first nonclass enclosing scope. For example:

class A { class B { // arbitrary nested class definitions friend class C;  }; };

is equivalent to:

class C; class A { class B { // arbitrary nested class definitions friend class C;  }; };

If the friend function is a member of another class, you need to use the scope resolution operator. For example:

class A { public: int f { } };

class B { friend int A::f; };

Friends of a base class are not inherited by any classes derived from that base class. The following example demonstrates this:

class A { friend class B; int a; };

class B { };

class C : public B { void f(A* p) { //   p->a = 2; } };

The compiler would not allow the statement p->a = 2 because class C is not a friend of class A, although C inherits from a friend of A.

Friendship is not transitive. The following example demonstrates this:

class A { friend class B; int a; };

class B { friend class C; };

class C { void f(A* p) { //   p->a = 2; } };

The compiler would not allow the statement p->a = 2 because class C is not a friend of class A, although C is a friend of a friend of A.

If you declare a friend in a local class, and the friend's name is unqualified, the compiler will look for the name only within the innermost enclosing nonclass scope. You must declare a function before declaring it as a friend of a local scope. You do not have to do so with classes. However, a declaration of a friend class will hide a class in an enclosing scope with the same name. The following example demonstrates this:

class X { }; void a;

void f { class Y { }; void b; class A { friend class X;   friend class Y;    friend class Z; //    friend void a; friend void b; //   friend void c; }; ::X moocow; // X moocow2; }

In the above example, the compiler will allow the following statements:

* friend class X: This statement does not declare ::X as a friend of A, but the local class X as a friend, even though this class is not otherwise declared. * friend class Y: Local class Y has been declared in the scope of f. * friend class Z: This statement declares the local class Z as a friend of A even though Z is not otherwise declared. * friend void b: Function b has been declared in the scope of f. * ::X moocow: This declaration creates an object of the nonlocal class ::X.

The compiler would not allow the following statements:

* friend void a: This statement does not consider function a declared in namespace scope. Since function a has not been declared in the scope of f, the compiler would not allow this statement. * friend void c: Since function c has not been declared in the scope of f, the compiler would not allow this statement. * X moocow2: This declaration tries to create an object of the local class X, not the nonlocal class ::X. Since local class X has not been defined, the compiler would not allow this statement.