Chinaunix首页 | 论坛 | 博客
  • 博客访问: 854948
  • 博文数量: 254
  • 博客积分: 5350
  • 博客等级: 大校
  • 技术积分: 2045
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 13:27
文章分类

全部博文(254)

文章存档

2015年(1)

2014年(9)

2013年(17)

2012年(30)

2011年(150)

2010年(17)

2009年(28)

2008年(2)

分类: C/C++

2011-11-24 10:54:13

  1. /* friend.cpp
  2. *
  3. *朋友类的访问
  4. */
  5. #include <iostream>
  6. #include <string>

  7. using namespace std;

  8. class Pal {
  9.     friend class Buddy;
  10. private:
  11.     string label;
  12. protected:
  13.     void PutLabel(string arg) { label = arg; }
  14. public:
  15.     Pal(string arg):label(arg) { }
  16. };

  17. class Buddy {
  18. private:
  19.     Pal palObject;
  20. public:
  21.     Buddy(string arg):palObject(arg) { }
  22.     void FriendDemo();
  23. };

  24. int main()
  25. {
  26.     Buddy aBuddy("First Message");
  27.     aBuddy.FriendDemo();

  28.     return 0;
  29. }

  30. void Buddy::FriendDemo()
  31. {
  32.     cout << "Reading private Pal::message from Buddy" << endl;
  33.     cout << palObject.label << endl;
  34.     cout << "Calling protected Pal:PutLabel function" << endl;
  35.     palObject.PutLabel("Second Message");
  36.     cout << palObject.label << endl;
  37.     cout << "Writing private Pal::message from Buddy" << endl;
  38.     palObject.label = "Third Message";
  39.     cout << palObject.label << endl;
  40. }

两个类互为朋友,一个类可以实现另一友类的私有,保护成员




/* mutual.cpp
*
*朋友类--两个类之间静态成员的相互访问
*/

#include

using namespace std;

class BClass;

class AClass {
    friend class BClass;
private:
    static int x;
public:
    AClass(int arg) { x = arg; }
    void AFunction();
};

class BClass {
    friend class AClass;
private:
    static int y;
public:
    BClass(int arg) { y = arg; }
    void BFunction();
};

//这里需要声明,否则友类调用时会提示未定义
int AClass::x;
int BClass::y;

int main()
{
    AClass a(123);
    BClass b(456);
    a.AFunction();
    b.BFunction();

    return 0;
}

void AClass::AFunction()
{
    cout << "Inside AClass::AFunction()" << endl;
    cout << "x == " << x << ";y == " << BClass::y << endl;
}

void BClass::BFunction()
{
    cout << "Inside BClass:BFunction()" << endl;
    cout << "x == " << AClass::x << ";y == " << y << endl;
}

朋友类的静态数据调用,实现了两个类的数据共享;值会累计不会一次调用后失效。。




/* friendfn.cpp
* 友元函数
*/
#include
#include

using namespace std;

class Two;

class One {
    friend void Show(One &c1, Two &c2);
private:
    string s1;    // Accessible to one and show()
public:
    One() { s1 = "Testing "; }
};

class Two {
    friend void Show(One &c1, Two &c2);
private:
    string s2;
public:
    Two() { s2 = "one, two, three"; }
};

int main()
{
    One obj1;
    Two obj2;
    Show(obj1, obj2);

    return 0;
}

//友元函数可以访问类的私有,保护成员
void Show(One &obj1, Two &obj2)
{
    cout << obj1.s1 << obj2.s2 << endl;
}

  一个函数为类的朋友,称为友元函数。这里函数Show()为两个类的朋友,可以访问这两个类的保护成员而
不受限制




/* friendmf.cpp
*朋友成员函数
*/
#include
#include

using namespace std;

class One ;

class Two {
private:
    string s2;
public:
    Two() { s2 = "one, two, three"; }
    void Show(One &c1);
};

class One {
    friend void Two::Show(One &c1);
private:
    string s1;
public:
    One() { s1 = "Testing "; }
};

int main()
{
    One obj1;
    Two obj2;
    obj2.Show(obj1);

    return 0;
}

void Two::Show(One &obj1)
{
    cout << obj1.s1 << s2 << endl;
}

一个类的函数是另一个类的朋友,称为朋友成员函数。。产生了和上例相同的输出




  一个类可以声明另一个类或函数为朋友,使朋友能访问声明类的专用成员与保护成员。由于朋友破坏了编写
健全C++程序的规则,因此只在绝对必要时才使用朋友。但朋友可以利用的时候,重要的一个就是重载操作符。。


阅读(609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~