C++ Tutorial/Class/friend function

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A friend function

#include <iostream> 
using namespace std; 
 
class MyClass { 
  int a, b; 
public: 
  MyClass(int i, int j) { a=i; b=j; } 
  friend int friendFunction(MyClass x); // a friend function 
}; 
 
// friendFunction() is a not a member function of any class. 
int friendFunction(MyClass x) 
{ 
  /* Because friendFunction() is a friend of MyClass, it can 
     directly access a and b. */ 
  int max = x.a < x.b ? x.a : x.b; 
 
  return max; 
} 
 
int main() 
{ 
  MyClass n(18, 111); 
 
  cout << "friendFunction(n) is " << friendFunction(n) << "\n"; 
 
  return 0; 
}
friendFunction(n) is 18

A function can be a member of one class and a friend of another

#include <iostream> 
using namespace std; 
 
class Cylinder; // a forward declaration 
 
enum colors { red, green, yellow }; 
 
class Cube { 
 colors color; 
public: 
  Cube(colors c) { color= c; } 
  bool sameColor(Cylinder y); 
}; 
 
class Cylinder { 
 colors color; 
public: 
  Cylinder(colors c) { color = c; } 
  friend bool Cube::sameColor(Cylinder y); 
}; 
 
bool Cube::sameColor(Cylinder y) { 
  if(color == y.color) 
    return true; 
  else 
    return false; 
} 
 
int main() 
{ 
  Cube cube1(red); 
  Cube cube2(green); 
  Cylinder cyl(green); 
 
  if(cube1.sameColor(cyl)) 
    cout << "cube1 and cyl are the same color.\n"; 
  else 
    cout << "cube1 and cyl are different colors.\n"; 
 
  if(cube2.sameColor(cyl)) 
    cout << "cube2 and cyl are the same color.\n"; 
  else 
    cout << "cube2 and cyl are different colors.\n"; 
 
  return 0; 
}
cube1 and cyl are different colors.
cube2 and cyl are the same color.

Friend functions and operator overloading

#include <iostream>
#include <string>
using namespace std;
class MyClass
{
    friend void Peek(const MyClass& aMyClass);
    friend ostream& operator<<(ostream& os, const MyClass& aMyClass);
public:
    MyClass(const string& name = "");
private:
    string m_Name;
};
MyClass::MyClass(const string& name):
    m_Name(name)
{}
void Peek(const MyClass& aMyClass);
ostream& operator<<(ostream& os, const MyClass& aMyClass);
int main()
{
    MyClass myObject("A");
    Peek(myObject);
    cout << myObject;
    return 0;
}
void Peek(const MyClass& aMyClass)
{
    cout << aMyClass.m_Name << endl;
}
ostream& operator<<(ostream& os, const MyClass& aMyClass)   
{
    os << "MyClass Object - ";
    os << "m_Name: " << aMyClass.m_Name;
    return os;
}

Friend functions can access private members of a class

#include <iostream>
using std::cout;
using std::endl;
class MyClass 
{
   friend void setX( MyClass &, int ); // friend declaration
public:
   MyClass() : x( 0 )
   { 
   }
   void print() const       
   { 
      cout << x << endl; 
   }
private:
   int x;
};
void setX( MyClass &c, int val )
{
   c.x = val;
} 
int main()
{
   MyClass counter;
   counter.print();
   setX( counter, 8 );
   counter.print();
   return 0;
}
0
8

Friend functions can be shared by two or more classes

#include <iostream> 
using namespace std; 
 
class Cylinder; // a forward declaration 
 
enum colors { red, green, yellow }; 
 
class Cube { 
 colors color; 
public: 
  Cube(colors c) { color = c; } 
  friend bool sameColor(Cube x, Cylinder y); 
}; 
 
class Cylinder { 
 colors color; 
public: 
  Cylinder(colors c) { color= c; } 
  friend bool sameColor(Cube x, Cylinder y); 
}; 
 
bool sameColor(Cube x, Cylinder y) 
{ 
  if(x.color == y.color) 
     return true; 
  else 
     return false; 
} 
 
int main() 
{ 
  Cube cube1(red); 
  Cube cube2(green); 
  Cylinder cyl(green); 
 
 
  if(sameColor(cube1, cyl)) 
    cout << "cube1 and cyl are the same color.\n"; 
  else 
    cout << "cube1 and cyl are different colors.\n"; 
 
  if(sameColor(cube2, cyl)) 
    cout << "cube2 and cyl are the same color.\n"; 
  else 
    cout << "cube2 and cyl are different colors.\n"; 
 
  return 0; 
}
cube1 and cyl are different colors.
cube2 and cyl are the same color.

friend square() function for Distance

#include <iostream>  
  using namespace std;  
  class Distance{  
     private:  
        int feet;  
        float inches;  
     public:  
        Distance() : feet(0), inches(0.0){  }  
                                         
        Distance(int ft, float in) : feet(ft), inches(in){  }  
        void showdist(){ 
           cout << feet << "\"-" << inches << "\""; 
        }  
        friend float square(Distance);    
  };  
  float square(Distance d){
     float fltfeet = d.feet + d.inches/12;  
     float feetsqrd = fltfeet * fltfeet;    
     return feetsqrd;               
    }  
  int main(){  
     Distance dist(3, 6.0);
     float sqft;  
    
     sqft = square(dist);  
     dist.showdist();  
     cout << sqft;
     return 0;  
  }

Share friend function between classes

#include<iostream.h>
class MyClassB;
class MyClassA
{
  char *name;
public:
         MyClassA(char *s){name=s;}
       friend void print(MyClassA &,MyClassB &);
};
class MyClassB
{
  char *name;
public:
       MyClassB(char *s){name=s;}
       friend void print(MyClassA &,MyClassB &);
};
void print(MyClassA &a,MyClassB &b)
{
  cout<<"the MyClassA is"<<a.name<<endl;
  cout<<"the MyClassB is"<<b.name<<endl;
}
int main()
{
       MyClassA s("Li Hu");
       MyClassB t("Wan Ping");
       print(s,t);
}
the MyClassA isLi Hu
the MyClassB isWan Ping