`
amyer
  • 浏览: 40242 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

转:友元函数和友元类

c++ 
阅读更多
友元函数(friend function)
1. 什么是友元函数?
    一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员
2. 友元函数的用处体现在哪里?
    2.1 使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类
    2.2 用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系
3. 使用友元函数前应注意:
    3.1 类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
    3.2 尽管类定义中有友元函数原型,友元函数仍然不是成员函数
    3.3 由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用
    3.4 public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
    3.5 友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类
    3.6 友元关系不满足对称性和传递性
    3.7 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数
4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将
    基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象

实例1. 友元函数的声明、定义与使用
#include <iostream>
using namespace std;

class Car
{
    friend void display(Car); //类"Car"的朋友display() //友元函数的声明
private:
    int speed;
    char color[20];
public:
    void input( )
    {
        cout<<"Enter the color : ";
        cin>>color;
        cout<<"Enter the speed : ";
        cin>>speed;
    }
};

void display(Car x) //友元函数的定义
{
    cout<<"The color of the car is : "<<x.color<<endl;
    cout<<"The speed of the car is : "<<x.speed<<endl;
}

int main( )
{
    Car mine;
    mine.input( ); //访问成员函数
    display(mine); //友元函数的使用 //将对象"mine"传给友元函数
    return 0;
}

输出结果:
Enter the color: green 回车
Enter the speed: 100 回车
The color of the car is : green
The speed of the car is : 100

实例2. 将一个函数声明为多个类的友元
#include <iostream>
using namespace std;

class Virus; //类'Virus'未定义前要用到,需事先告诉编译器'Virus'是一个类

class Bacteria
{
private:
    int life;
public:
    Bacteria() { life=1; }
friend void Check(Bacteria, Virus); //类'Bacteria'中,将Check声明为友元函数
};

class Virus
{
private:
    int life;
public:
    Virus() : life(0) {}
friend void Check(Bacteria, Virus); //类'Virus'中,将Check声明为友元函数
};

void Check (Bacteria b, Virus v) //友元函数的定义
{
    if (b.life==1 || v.life==1)
    {
        cout<<"\nSomething is alive.";
    }
    if (b.life==1)
    {
        cout<<"\nA bacteria is alive.";
    }
    if (v.life==1)
    {
        cout<<"\nA virus is alive.";
    }
}

int main()
{
    Bacteria fever;
    Virus cholera;
    Check(fever, cholera); //友元函数的调用
    return 0;
}

输出结果:
Something is alive.
A bacteria is alive.

友元类(friend class)
1. 友元类可以访问与之为友元关系的类的所有私有成员
2. 友元类使用较少

实例: 友元类
#include <iostream>
using namespace std;

class Add
{
private:
    int x,y;
public:
    Add()
    {
        x=y=4;
    }
friend class Support; //类'Support'现在是类'Add'的朋友
};

class Support
{
public:
    void Sum(Add ob)//此函数可访问类'Add'的所有私有成员
    {
        cout<<"The sum of the 2 members is : "<<(ob.x+ob.y)<<endl;
    }
};


int main()
{
    Add ad;
    Support sup;
    sup.Sum(ad);
    return 0;
}

输出结果:
The sum of the 2 members is : 8
分享到:
评论

相关推荐

    友元函数和友元类_友元函数用法_

    标题"友元函数和友元类"涉及到两个核心概念:友元函数和友元类。 **友元函数** 是一个非成员函数,但它被声明为某个类的友元,这意味着它可以直接访问该类的私有和受保护成员。友元函数不是类的成员,因此它们不在...

    实验二:友元和函数重载

    2. **声明友元类**:一个类可以声明另一个类为友元,使得友元类的所有成员函数都可以访问原类的私有和保护成员。例如: ```cpp class FriendClass; class MyClass { private: int myData; public: friend ...

    C++友元函数及友元类全总结

    本文将详细介绍C++中的友元函数和友元类,以及它们的使用方法和注意事项。 #### 二、友元函数 **1. 为什么引入友元函数** 在C++中,当需要实现类之间的数据共享时,传统的做法是通过设置公共成员函数来访问私有...

    cpp_200706_友元函数_

    2. **访问权限**:友元函数可以访问其友元类的私有和保护成员,但这种访问权限并不传递,即友元函数不能让其他函数或类间接访问友元类的私有和保护成员。 3. **不继承**:子类不会自动继承父类的友元关系。如果需要...

    运算符重载:友元(friend)函数问题

    运算符重载:友元(friend)函数问题

    C ++友元函数的理解

    1. **非成员函数**:友元函数不是类的成员,因此它没有所属的类,但它可以访问类的私有和受保护成员。 2. **权限提升**:友元函数获得了访问权限的提升,可以访问它所友元的类的私有和受保护成员。 3. **非静态关联*...

    C++之友元:友元函数和友元类详解

    友元函数友元类 二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend 类型 友元函数名(参数表);友元的...

    NDK14_C++基础:友元,模板方法,模板类,类型转换

    一 友元 类似 java 中享元模式:实例的共享(ImageLoader Lru 算法 存储图片) 友元:类或函数的共享 优点:提高效率、表达清晰 缺点:破坏封装性 ...友元函数不能被派生类继承 友元函数不能使用this

    友元类,友元函数,友元成员函数

    友元类、友元函数和友元成员函数是C++中实现类间交互的重要方式,它们帮助我们在设计复杂的数据结构和算法时打破封装的限制,提高代码的灵活性和效率。下面我们将深入探讨这三个概念及其工作原理。 首先,**友元类*...

    C++友元习题.pdf

    友元函数也有缺点,例如需要在类的内部声明友元函数,需要在类的外部定义友元函数,这使得代码的组织和维护变得复杂。此外,友元函数也可以使得类的设计变得复杂。 本资源摘要信息涵盖了C++语言中友元函数的使用...

    c++ 友元函数入门教程

    在类的内部,使用`friend`关键字声明一个函数为友元函数,这样该函数就可以不受限制地访问类的所有成员,包括私有和保护成员。例如: ```cpp class MyClass { public: friend void myFriendFunction(MyClass& obj)...

    友元函数详细讲解

    友元函数和友元类是类与类之间、类与函数之间一种特殊的授权关系。通过关键字“friend”在类的定义中声明,被声明为友元的函数或类就可以访问该类的所有成员,无论这些成员的访问权限是public、protected还是private...

    C++运算符重载 成员函数与友元函数详解

    友元函数不是类的成员,但可以访问类的私有和保护成员。在运算符重载中,友元函数常用于需要同时操作两个对象或者操作数不是类对象的情况。例如,类`B`的`operator+`和`operator-`就是友元函数: ```cpp friend B ...

    友元函数和友元类的定义及使用.docx

    友元函数和友元类的定义及使用 友元函数和友元类是一种特殊的类关系,在 C++ 编程语言中.play a crucial role in defining the relationship between classes. 在本文中,我们将探讨友元函数和友元类的定义及使用,...

    友元函数和友元类的定义及使用 (2).pdf

    友元函数和友元类的定义及使用 在 C++ 编程语言中,友元函数和友元类是两个重要的概念,它们在对象之间的关系和交互中扮演着关键角色。下面将详细介绍友元函数和友元类的定义及使用。 一、友元函数 友元函数是指...

    Practice_日期合并输出_友元函数_

    在本例中,可能定义了一个包含日期和时间的类,为了能够从外部合并输出日期和时间,可能会声明一个友元函数。这样,即使日期和时间数据是私有的,友元函数也能直接访问并进行格式化输出。 3. **C++类封装**: 类是...

    友元函数和友元类的定义及使用.pdf

    友元函数和友元类的定义及使用、运算符重载 本文将详细讲解友元函数和友元类的定义及使用,并结合实践案例,演示如何使用友元函数和友元类实现复杂的功能。同时,本文还将讲解运算符重载的概念和使用方法,并提供...

    C++友元函数的分析和理解

    在C++编程语言中,友元函数是一种特殊类型的非成员函数,它被授予访问类的私有和受保护成员的权限。这种机制是为了在特定情况下打破封装性,以实现更灵活的设计。本篇文章将深入探讨C++友元函数的概念、用途、优缺点...

    友元函数代码实例

    友元函数,类外普通函数声明为类的友元,之后即可与类共享数据

Global site tag (gtag.js) - Google Analytics