精华内容
下载资源
问答
  • C++中的友元函数的作用# 友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,个不同函数或另个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装...

    C++之中的友元函数的作用#

    友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员。c++中的友元为封装隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视内部的秘密。

    友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
    友元函数 :

    友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
    friend 类型 函数名(形式参数);
    友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
    一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
    友元函数的调用与一般函数的调用方式和原理一致。

    转载部分:

    1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率
    具体来说:为了使其他类的成员函数直接访问该类的私有变量

    即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数

    优点:能够提高效率,表达简单、清晰

    缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。

    2、什么时候使用友元函数:
    1)运算符重载的某些场合需要使用友元。

    2)两个类要共享数据的时候

    3、怎么使用友元函数:

    友元函数的参数:
    因为友元函数没有this指针,则参数要有三种情况:

    1、 要访问非static成员时,需要对象做参数;–常用(友元函数常含有参数)

    2、 要访问static成员或全局变量时,则不需要对象做参数

    3、 如果做参数的对象是全局对象,则不需要对象做参数

    友元函数的位置:
    因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。

    友元函数的调用:
    可以直接调用友元函数,不需要通过对象或指针


    本文来自 AndrewYZWang 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/andrewgithub/article/details/78760381?utm_source=copy

    本文来自 AndrewYZWang 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/andrewgithub/article/details/78760381?utm_source=copy

    展开全文
  • 、友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,...友元的作用在于提高程序的运行效率 友元函数注意事项:1、友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对
  • 、友元介绍我们知道,类成员函数可以访问同类...友元函数友元类二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类成员函数加以区别,定义方式是在类中用关键字friend说明该函数...

    一、友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。

    友元是一种允许非类成员函数访问类的非公有成员的一种机制。

    可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。

    友元函数

    友元类

    二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明

    为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下:

    friend  类型 友元函数名(参数表);

    友元的作用在于提高程序的运行效率

    友元函数注意事项:1、友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。

    2、友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

    3、某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

    4、友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性。

    #include

    #include

    using namespace std;

    class Point

    {

    friend double Distance(const Point &p1, const Point &p2);

    public:

    Point(int x, int y);

    private:

    int x_;

    int y_;

    };

    Point::Point(int x, int y) : x_(x), y_(y)

    {

    }

    double Distance(const Point &p1, const Point &p2)

    {

    double dx = p1.x_ - p2.x_;

    double dy = p1.y_ - p2.y_;

    return sqrt(dx * dx + dy * dy);

    }

    int main(void)

    {

    Point p1(3, 4);

    Point p2(6, 9);

    cout << Distance(p1, p2) << endl;

    return 0;

    }

    程序中Distance 是Point类的友元函数,可以访问类的私有数据成员。

    三、友元类如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过A的Public的成员函数进行间接存取

    把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取

    友元类:一个类可以作另一个类的友元

    友元类的所有成员函数都是另一个类的友元函数

    友元类的声明:friend class 类名;

    友元类注意事项:1、友元关系是单向的

    2、友元关系不能被传递

    3、友元关系不能被继承

    TeleController.h :

    #ifndef  _TELE_CONTROLLER_H_

    #define _TELE_CONTROLLER_H_

    class Television;

    class TeleController

    {

    public:

    void VolumeUp(Television &tv);

    void VolumeDown(Television &tv);

    void ChanelUp(Television &tv);

    void ChanelDown(Television &tv);

    };

    #endif // _TELE_CONTROLLER_H_

    TeleController.cpp :

    #include "TeleController.h"

    #include "Television.h"

    void TeleController::VolumeUp(Television &tv)

    {

    tv.volume_ += 1;

    }

    void TeleController::VolumeDown(Television &tv)

    {

    tv.volume_ -= 1;

    }

    void TeleController::ChanelUp(Television &tv)

    {

    tv.chanel_ += 1;

    }

    void TeleController::ChanelDown(Television &tv)

    {

    tv.volume_ -= 1;

    }

    Television.h:

    #ifndef _TELEVISION_H_

    #define _TELEVISION_H_

    class TeleController;

    class Television

    {

    friend class TeleController;

    public:

    Television(int volume, int chanel);

    private:

    int volume_;

    int chanel_;

    };

    #endif // _TELEVISION_H_

    Television.cpp:

    #include "Television.h"

    Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel)

    {

    }

    main.cpp:

    #include "Television.h"

    #include "TeleController.h"

    #include

    using namespace std;

    int main(void)

    {

    Television tv(1, 1);

    TeleController tc;

    tc.VolumeUp(tv);

    return 0;

    }

    将TeleController 类作为Television类的友元类,这样TeleController 类的成员函数就都可以访问Television类的所有成员,包括私有。

    展开全文
  • 、友元介绍我们知道,类成员函数可以访问同类...友元函数友元类二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类成员函数加以区别,定义方式是在类中用关键字friend说明该函数...

    一、友元介绍
    我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。

    友元是一种允许非类成员函数访问类的非公有成员的一种机制。
    可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。

    友元函数
    友元类

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

    friend  类型 友元函数名(参数表);
    友元的作用在于提高程序的运行效率

    友元函数注意事项:
    1、
    友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。

    2、友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

    3、某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

    4、友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性。

    举个栗子:

    #include <math.h>
    #include <iostream>
    using namespace std;
    class Point
    {
        friend double Distance(const Point &p1, const Point &p2);
    public:
        Point(int x, int y);
    private:
        int x_;
        int y_;
    };
    Point::Point(int x, int y) : x_(x), y_(y)
    {
    }
    double Distance(const Point &p1, const Point &p2)
    {
        double dx = p1.x_ - p2.x_;
        double dy = p1.y_ - p2.y_;
        return sqrt(dx * dx + dy * dy);
    }
    int main(void)
    {
        Point p1(3, 4);
        Point p2(6, 9);
        cout << Distance(p1, p2) << endl;
        return 0;

    }          //程序中Distance 是Point类的友元函数,可以访问类的私有数据成员。

    三、友元类
    如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过A的Public的成员函数进行间接存取
    把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取
    友元类:一个类可以作另一个类的友元
    友元类的所有成员函数都是另一个类的友元函数
    友元类的声明:
    friend class 类名;

    友元类注意事项:
    1、友元关系是单向的
    2、友元关系不能被传递
    3、友元关系不能被继承



    展开全文
  • C++之友元函数总结

    2017-04-08 21:35:30
    友元函数不仅可以是一般函数,而且可以是另个类成员函数 友元函数可以在类作用域外定义,但它需要在类体中进行声明 4.注意事项 友元函数不是当前类成员函数,而是独立于当前类外部函数,但它可以访问该类...

    1.介绍

    友元是一种允许非类成员函数访问类的非公有成员的一种机制

    2.分类

    友元函数、友元类

    3.友元函数

    友元函数不仅可以是一般函数,而且可以是另一个类的成员函数

    友元函数可以在类作用域外定义,但它需要在类体中进行声明

    4.注意事项

    友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员。

    友元函数不受类中的访问权限关键字的限制,可以把它放在类的公有、私有、保护部分,但结果都一样。

    某类的友元函数的作用域并非该类作用域。如果该友元函数是另一个类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同,

    友元函数破坏了面向对象程序设计类的封装性,所以不提倡

    5.作用

    在于提高代码的运行效率

    展开全文
  • 、友元介绍 我们知道,类成员函数可以访问同类其他成员函数,包括公有、私有和保护成员。而类外部函数只能访问类公有成员...友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类成员函数加以区
  • C++之友元函数friend

    2015-04-06 14:08:21
    但有时需要定义一些函数,这些函数不是类的部分,但又需要访问类的数据成员,这样可将这些函数定义为该类的友元函数。除了友元函数外,还有友元类,它们被统称为友元。友元的作用是提高程序的执行效率,但也牺牲了...
  • 友元函数friend

    2017-11-05 14:30:43
    2、该函数位于类的作用中。 3、该函数必须经由个对象去激活(有个this指针)。 通过将函数声明为static,可以让它只有前两种性质,通过将个函数声明为友元可以使它只具有第种性质。什么是友元函数:...
  • 但是,有时需要定义一些函数,这些函数不是类的部分,但 又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有 友元类,两者统称为友元。友元的作用是提供了工序的运行...
  • 友元函数

    2019-03-07 14:20:02
    个常规的成员函数声明描述了三件在逻辑上互不相同的事情: 1-该函数能访问类声明的私用部分; 2-该函数位于类的作用中; 3-该函数必须经由个对象去激活(有个This指针)。 ...
  • 但是,有时需要定义一些函数,这些函数不是类的部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提供了工序的运行...
  • 但是,有时需要定义一些函数,这些函数不是类的部分,但又需要频繁地访问类的数据成员, 这时可以将这些函数定义为该 函数的友元函数。除了友元函数外,还有友元类, 两者统称为友元。友元的作用是提高了程序的运行效率...
  • 什么场景下会用到友元函数

    千次阅读 2017-10-11 07:56:42
    什么场景下会用到友元函数,友元函数的作用是什么,友元函数和普通成员函数又有怎样的区别?这都是C++当中的一些基本概念,掌握好了无论是维护项目还是做项目开发都大有裨益。本文主要浅谈一下C++中的友元函数,如有...
  • 友元函数 个常规的成员函数声明描述了三件在逻辑上相互不同的事情 ...2. 该函数位于类的作用中 3. 该函数必须经由个对象去激活(有个this指针)   通过将函数声明为友元函数 1. 则 2,3条件失效, 2.
  • 1、友元函数 在类中一般的成员函数具备: (1)、该函数能访问类中的私有部分 (2)、该函数位于类的作用中 (3)、该函数必须经由个对象去激活,也就是说有个this指针; 友元函数不同处: (1)、在#include<...
  • 友元一个常规成员函数声明描述了三件在逻辑上相互不同事情①该函数能访问类声明中私用部分②该函数位于作用中③该函数必须经由个对象去激活(有个this指针)通过将函数声明为static,可以让他只有前两...
  • 定义个类,本质上是定义个数据类型蓝图。这实际上并没有定义任何数据,但它定义了类名称意味着什么,也就是说,它定义了类对象包括了什么,以及可以在这个对象上执行哪些操作。 类定义格式如下: ...
  • 友元

    千次阅读 2018-08-29 11:15:20
    友元 友元的内容: 引入友元 友元的分类 友元函数 友元类 友元的优缺点 友元的注意事项 ... 该函数位于类的作用中。 该函数必须经由个隐藏的this指针去调用。 通过该函数声明为s...
  • C++之友元

    2017-04-08 22:02:20
    如果在本类以外的其他地方定义了个函数,(这个函数可以是不属于任何类的非成员函数,也...比如写个display函数,它的作用是输出某个类中的成员值。 void display (Time& t) {cout 要将它作为Time类的友元函数
  • C++学习17之友元

    2018-02-26 00:41:57
    *员,这时可以将这些函数定义为该函数的友元函数。 *同类对象间无私处,异类对象间有友元 *除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行 *效率(即减少了类型检查和安全性检查等都...
  • c++之友元

    2017-11-17 11:30:41
    友元的作用假设A为B 的友元类,那么可以在A中的private中定义个B的对象C,并且可以在A中的函数中直接通过c访问B的私有成员或函数,而不需要往这个函数传递参数注意事项1.友元关系不可以传递 2.友元关系的单向性...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

友元函数的作用之一