精华内容
下载资源
问答
  • 以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下
  • C++规定有四个运算符 =, ->, ...那么为什么赋值运算符不可以重载为类的友元函数?像同样都是双目运算符的+为什么它就可以呢? 在讨论这问题之前,先看一测试的程序: 代码如下:#include <iostream>using namespace std;
  • 二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend 类型 友元函数名(参数表);友元的作用在于提高...
  • 友元函数 友元类 友元成员函数

    千次阅读 2018-05-07 22:34:40
    友元 一般来说,类内的私有数据是对外不可见的,但在有些情况下,我们需要在类外对该类的私有数据进行访问,这就需要用到一种新技术——友元(friend),即在声明前...友元函数是指某些非类成员函数,但可以访问类...

    友元

    一般来说,类内的私有数据是对外不可见的,但在有些情况下,我们需要在类外对该类的私有数据进行访问,这就需要用到一种新技术——友元(friend),即在声明前添加关键字friend

    友元关系是单向的,即如果A是B的友元,但B不一定是A的友元;
    友元关系无传递性,即如果A是B的友元,B是C的友元,但A不一定是C的友元。


    1. 友元函数

    友元函数是指某些非类成员函数,但可以访问类内的私有数据。

    #include <iostream>
    using namespace std;
    
    class A {
    private:
        int data;
    public:
        A() : data(1) {}
        friend void show( const A& t );  //添加friend定义友元函数
    };  
    
    /* 友元函数在类外声明时不加friend */
    void show( const A& t ) {
        cout << "data = " << t.data << endl;  
    }
    
    int main(void) {  
        A a;
        show(a);  
    
        return 0;  
    }
    
    /*
    
    运行结果:
    data = 1
    
    */

    2. 友元类

    友元类是指若需要在类B中直接访问类A的私有数据,因此将B作为A的友元(在A中声明friend class B;)。
    友元类中的成员函数、私有数据都可以在另一个类中被使用(即类B中可以直接使用类A的私有数据等)

    class Tv {
    private: 
        int state;
    public: 
        friend class Remote;  //声明Remote为Tv的友元类
        enum{ Off, On };
    
        Tv( int s = Off ) : state(s) {}
        void onoff() { state = (state == On) ? Off : On; }
    };
    
    class Remote {
    public: 
        void onoff( Tv & t ) { t.onoff(); }
    };

    3. 友元成员函数

    友元成员函数是指类中的一个成员函数被定义为友元函数。
    与友元类不同的是,只有友元成员函数可以在另一个中被使用,其余函数都不可以。

    #include <iostream>
    using namespace std;
    
    class B;  //前向声明
    
    class A{
    private: 
        int a;
    public: 
        A() { a = 1; }
        void print( B & b );
    };
    
    /* 示例位置1 */
    
    class B{
    private: 
        int b;
    public: 
        B() { b = 6; }
        void print() { cout << b << endl; }
        friend void A::print( B & b );  //友元成员函数
    };
    
    /* 被定义为友元成员函数的函数必须在类外(另一个使用该函数的类后面)定义 */
    void A::print( B & b ) {
        cout << "b = " << b.b << endl;
    }
    
    int main() {
        A a;
        B b;
        a.print( b );
    
        return 0;
    }
    
    /*
    
    输出结果:
    b = 6
    
    */

    需要注意的是:
    (1)类的前向声明。由于在A中的print函数需要使用B,如果不进行B的前向声明,编译器就不知道B是一个类,会报错。
    (2)类的排列顺序。在类B中会用到A的方法print(),因此需要先定义A,再定义B。
    (3)友元成员函数的定义位置。友元成员函数不能使用内联代码,类中只能有函数声明。函数定义需要放到类之后,在类外进行定义,而且必须放到另一个类定义的后面。(对上面代码来说,若将A::print()的定义放在类B定义之前——示例位置1处,也会报错,提示类B未完成)

    对于友元的位置在何处生明,可以简单记为friend在哪,哪个就可以被外面直接访问。(friend在类A,A就可以被其他特定位置访问)

    展开全文
  •  讲友元之前先讲普通的成员函数函数指针  <code class=sourceCode>class Std_interface {  public:  virtual void suspend() = 0;  };  // define the pointer of function  typedef void (Std_...
  • 友元函数 friend

    千次阅读 2017-07-06 15:09:24
    一、一个类的成员函数有三个互不相干作用 1.可以通过类的成员方法,访问它的私有数据。 2.该函数的作用域在类中。 3.在外部调动该函数必须通过成员访问...2.友元函数可以在类中实现,也可以在类外实现(一般是在类的

    一、一个类的成员函数有三个互不相干作用

    1.可以通过类的成员方法,访问它的私有数据。

            2.该函数的作用域在类中。

            3.在外部调动该函数必须通过成员访问符访问,也就是必须经由一个对象去激活(有一个this指针)。

    二、友元函数

    1.友元函数作用域不属于类的作用域,不是类的成员,也就不是类的方法,不受公有、私有、保护限制。

    2.友元函数可以在类中实现,也可以在类外实现(一般是在类的外部实现)。

    3,声明成友元函数,可以通过友元函数实现对类的私有数据进项访问。(但是他没有this指针)

    4.一般友元函数声明在类的最前面

    5.友元函数是为另外一个类的成员方法,则其作用域为另外一个类的作用域。

    6.友元类,在一个类中声明为友元类,则该友元类都可以访问他的私有数据

    在类的外部实现,也可以在内部实现

    三、输出运算符<<、输入运算符>>的重载

    我们平时可以用流 std::cout<<str<<n ; std::cin>>str>>n ; 输出、输入字符串和整型等内置类型的值。但是对于我们自定义的类,比如 Student 类,却不能直接通过 cout<<Student 或 cin>>Student 这样的形式来输出类的内容或给类赋值。怎么办呢?我们可以通过重载输出、输入运算符,让自定义的类也支持这样的操作。

    1.在引入iostream头文件,标准的命名空间的后,ostream 输出流(类),其中cout是它的一个对象, istream输入流对象,cin是它的一个对象。

    2.输入输出流对象一般只是对内置类型进行输出,对对象的输出要进行运算符的重载

    3.输入、输出运算符的重载,一般通过友元函数,进行实现,友元函数可以访问一个类的私有数据,通过友元函数可以实现对类的输出;

           在类中声明成友元函数才能访问私有数据

      这样的话调动cout<<c<<endl;就可以对对象进行输出

    4.输入输出运算符的重载也可以是类的成员方法,在类的内部实现,只不过输出格式比较诡异通过类的对象调动cout对象 c<<cout;

    展开全文
  • 关于c+模板之友元类友元函数的实例化,图形界面之矩形。
  • 友元函数详细讲解

    2013-10-26 22:52:36
    友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有...
  • 1、为什么需要把需要把运算符重载为友元函数? 运算符重载,如果重载为类的成员函数能解决问题的话最好。但是有些情况下,将运算符重载为成员函数并不能有效的解决问题,这个时候考虑将运算符重载为全局函数。但是...

    1、为什么需要把需要把运算符重载为友元函数?
    运算符重载,如果重载为类的成员函数能解决问题的话最好。但是有些情况下,将运算符重载为成员函数并不能有效的解决问题,这个时候考虑将运算符重载为全局函数。但是将运算符重载为全局函数也有一些不足。遇到这种情况的一种策略就是把运算符重载为友元函数。

    Complex x,y;
    y=x+5//情况一
    y=5+x;//情况二
    
    • 情况一
      这种情况将加号运算符重载为Complex类的成员函数没有问题。x+5等价于x.operator+(5)。
    • 情况二
      这种情况如果将加号运算符重载为Complex类的成员函数不会发起符号函数的调用,但是如果将加号重载为全局函数,全局函数内部又无法访问到x对象的数据。此时考虑将该全局函数生命为Complex类的友元函数。

    2、什么情况下需要将运算符重载为友元函数?

    • 情况一
      对双目运算符进行的重载,运算符左侧运算对象不能够发起运算符重载函数的调用(左侧运算对象的类型与右侧不匹配,但是定义运算符函数属于右侧类类型的成员函数 ,因此无法发起函数调用。),此时应该重新写一个全局的运算符重载函数,并在该类中将此方法声明为友元函数。
    • 其它情况
      (遇到后再做记录。)
    展开全文
  • C++类的友元函数

    2019-02-27 14:56:49
    友元函数是类的辅助手段,友元能够引用类中本来被隐蔽的信息。 使用友元的目的是基于程序的运行效率。 一般运算符重载和两个类共享数据这两个场合需要使用友元。 友元可以是函数,也可以是类,...

    一、类中成员函数作用

    1. 可以通过类的成员方法,访问它的私有数据。
    2. 该函数的作用域在类中。
    3. 在外部调动该函数必须通过成员访问符访问,也就是必须经由一个对象去激活(有一个this指针)。

    二、友元函数

    特点

    1. 友元函数是类的辅助手段,友元能够引用类中本来被隐蔽的信息。
    2. 使用友元的目的是基于程序的运行效率。
    3. 一般运算符重载和两个类共享数据这两个场合需要使用友元。
    4. 友元可以是函数,也可以是类,在一个类中声明为友元类,则该友元类都可以访问他的私有数据。
    5. 友元是非传递的。
    6. 友元函数作用域不属于类的作用域,不是类的成员,也就不是类的方法,不受公有、私有、保护限制。
    7. 友元函数可以在类中实现,也可以在类外实现(一般是在类的外部实现)。

    优缺点

    • 优点:能够提高效率,表达简单、清晰。
    • 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数

    参数

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

    1. 要访问非static成员时,需要对象做参数;
    2. 要访问static成员或全局变量时,则不需要对象做参数;
    3. 如果做参数的对象是全局对象,则不需要对象做参数;

    三、举例说明

     

    #include<iostream>
    using namespace std;
    class A{
    private://友元函数作用域不属于类的作用域,不是类的成员,也就不是类的方法,不受公有、私有、保护限制。
    	int i;
    	friend void FriendFun(A *,int);
    public:
    	void MemberFun(int);
    }; 
    void FriendFun(A *ptr,int x)
    {
    	ptr->i=x;//友元函数通过对象参数访问私有数据成员 
    }
    void A::MemberFun(int x)
    {
    	i=x;//成员函数通过this指针在对象上操作 
    }
    int main()
    {
    	A Aobj;
    	FriendFun(&Aobj,5);
    	Aobj.MemberFun(5);
    	
    	return 0;
    }
    

     

     

    展开全文
  • 友元为什么需要友元get/set Method为什么使用友元关系辨别同类间无私处异类间有友元友元不是成员友元函数全局函数作友元语法格式实战操练:求两点之间的距离类的成员函数作友元语法格式实战操练:求两点之间的距离前...
  • 一个实例,实现运算符重载(成员函数和非成员函数两种方式),友元函数的使用,注意事项等,自己学习时编写的,
  • 一、友元函数友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数。友元函数的说明如下:friend 数据类型函数名(参数)其中,friend是说明友元函数的关键字,...
  • C++之中的友元函数的作用

    万次阅读 多人点赞 2017-12-09 17:23:22
    友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员...友元函数友元函数是可以直接访问类的私有成员的非成员函
  • 友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
  • 友元函数代码实例

    2015-05-19 19:56:54
    友元函数,类外普通函数声明为类的友元,之后即可与类共享数据
  • 友元函数和友元类

    2021-03-22 20:28:48
    友元函数 C++提供友元(friend)机制,允许一个类将其非公有成员的访问权授予指定的函数或类。友元的声明只能出现在类定义的内部的任何地方,由于友元不是授予友元关系(friendship)的那个类的成员,所以它们不受...
  • 私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。
  • 当声明了友元函数或者友元类之后,该函数或者类可以访问类的所有成员,包括private成员,当然访问过程需要通过类的对象进行。例如声明一个友元函数,有两种情况: ①该函数是普通的全局函数 一般情况下,使用一个...
  • C++ 友元函数

    2020-11-20 16:37:25
    1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。 具体来说:为了使其他类的成员函数...
  • 什么场景下会用到友元函数

    千次阅读 2017-10-11 07:56:42
    什么场景下会用到友元函数友元函数的作用是什么友元函数和普通成员函数又有怎样的区别?这都是C++当中的一些基本概念,掌握好了无论是维护项目还是做项目开发都大有裨益。本文主要浅谈一下C++中的友元函数,如有...
  • C++——友元函数&内联函数

    千次阅读 多人点赞 2018-12-07 23:55:15
    友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。 友元可以是一个函数,该函数被...
  • C++中的友元函数

    2021-05-13 02:49:54
    1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体说:为了使其他类的成员函数直接访问...
  • 在一个类中,可以利用关键字friend将其他的函数或类声明为友元,如果友元是一般函数或者类的成员函数,称为友元函数,如果友元是一个类,则成为友元类,友元类的所有成员函数都自动成为友元函数友元函数友元...
  • 主要介绍了C++编程中的友元函数和友元类,属于较为冷僻的知识,在实际开发中较少使用,需要的朋友可以参考下
  • 什么是友元? 友元就是朋友,c++中为了方便访问某个类的私有成员,引入了友元的概念 友元用 “friend” 定义 友元函数 友元函数分为两种 友元全局函数 友元成员函数 友元全局函数 class Coordinate { friend void...
  • 在c++中,经常会定义类。类有一个特点就是数据封装数据...使用友元函数将百分制学生的成绩转换成相应的分数等级。 #include<iostream> using namespace std; #include<iomanip> #include<string.h>
  • C++ 中友元函数与友元类详解总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元...
  • 全局函数、类成员函数 作为友元函数 #include "stdafx.h" #include using namespace std; #if 0 同类对象间无私处 异类对象间有友员 //函数(可以是全局函数,也可是类成员函数)可以作友元,称为友元函数 //友元...
  • 友元函数

    2018-09-26 17:16:14
    友元函数和友元类进行了一些整理: 一、关于友元函数的定义: 友元函数可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。 二、友元函数的特点: 友元函数不是当前类的成员函数,但它可以访问该类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,590
精华内容 19,036
关键字:

友元函数是什么