关于C++中的友元函数的一些总结

1.友元函数的简单介绍

1.1为什么要使用友元函数

在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

1.2使用友元函数的优缺点

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

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

2.友元函数的使用

2.1友元函数的参数:

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

2.1.1 要访问非static成员时,需要对象做参数;

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

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

2.2友元函数的位置

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

2.3友元函数的调用

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

2.4友元函数的分类:

根据这个函数的来源不同,可以分为三种方法:

2.4.1普通函数友元函数

2.4.1.1 目的:使普通函数能够访问类的友元

2.4.1.2 语法:

声明: friend + 普通函数声明

实现位置:可以在类外或类中

实现代码:与普通函数相同

调用:类似普通函数,直接调用

2.4.1.3代码:


代码如下:

class INTEGER

{

  friend void Print(const INTEGER& obj);//声明友元函数

};

void Print(const INTEGER& obj)

{

   //函数体

}

void main()

{

  INTEGER obj;

  Print(obj);//直接调用

}

2.4.2类Y的所有成员函数都为类X友元函数—友元类

2.4.2.1目的:使用单个声明使Y类的所有函数成为类X的友元,它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能。

2.4.2.2语法:

声明位置:公有私有均可,常写为私有(把类看成一个变量)

声明: friend + 类名(不是对象哦)

2.4.2.3代码:


代码如下:

class girl;

class boy

{

public:

  void disp(girl &);

};

void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数

{

  cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量

}

class girl

{

private:

  char *name;

  int age;

  friend boy; //声明类boy是类girl的友元

};

main函数就不写了和普通调用时一样的。

2.4.3类Y的一个成员函数为类X的友元函数

2.4.3.1目的:使类Y的一个成员函数成为类X的友元,具体而言:在类Y的这个成员函数中,借助参数X,可以直接以X的私有变量

2.4.3.2语法:

声明位置:声明在公有中 (本身为函数)

声明:friend + 成员函数的声明

调用:先定义Y的对象y---使用y调用自己的成员函数---自己的成员函数中使用了友元机制

2.4.3.3代码:

实现代码和2.4.2.3中的实现及其相似只是设置友元的时候变为friend void boy::disp(girl &);自己解决喽……

小结:其实一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须滴。

4.友元函数和类的成员函数的区别

4.1 成员函数有this指针,而友元函数没有this指针。

4.2 友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

(0)

相关推荐

  • 解析C++中不能重载为友元函数的四个运算符

    C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢?现在先说说赋值运算符"="的重载C++规定赋值运算符"="只能重载为类的非静态成员函数,而不可以重载为类的友元函数.不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员.而赋值运算符"="是基于对象操作的.那么为什么赋值运算符不可以重载为类的友元函数?像同样都是双目

  • C++中的friend友元函数详细解析

    友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend. 我们已知道类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性.另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运

  • C++ 中友元函数与友元类详解

    C++ 中友元函数与友元类详解 总的来说,友元分为两类:友元函数与友元类.友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制.可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数.也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员.        友元函数的注意事项: (1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用"对象名.对象成员"方式来访问, 友元函数可以访问类中的所

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

    复制代码 代码如下: #include<iostream>using namespace std;class A{    int x,y;    public:    A(int xx,int yy):x(xx),y(yy){}    A(){x=0;y=0;}    A operator+(const A&b) //不加const限定,也可以    { return A(x+b.x,y+b.y); }    A operator-()    { return A(-x,-y); } 

  • C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮助作用. 操作步骤: 1)在MyFriend类中,将Father类定义成友元 2)写一个Son类继承自Father类 3)在Father类和Son类的构造函数中分别创建MyFriend对象,并定义其内部的三个变量 4)在MyFriend类的构造函数中创建Father对象,并定义其内部的三个变量 结果

  • 有关C++继承与友元、继承与类型转换详解

    实例如下: #include <iostream> using namespace std; class a{ friend class pal; private: int i; protected: int j; public: int k; }; class b:public a{ protected: int l; }; class c:protected a{}; class d:private a{}; class e:public b{}; class pal{ public: v

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

    一.友元介绍我们知道,类的成员函数可以访问同类的其他成员函数,包括公有.私有和保护成员.而类的外部函数只能访问类的公有成员. 友元是一种允许非类成员函数访问类的非公有成员的一种机制.可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元. 友元函数友元类 二.友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend  类型 友元函数名(参数表);友元的作用在于提高程序的运行效率 友

  • C++中的友元函数与友元类详情

    目录 一.问题背景 二.友元函数 三.友元类 一.问题背景 对类的封装是C++三大特性中的一个重要特性,封装好的数据在类的外部是访问不到的但是一旦出了问题,想要操作被封装的数据怎么办呢?由此友元函数友元类诞生了.在类中用friend关键字声明的函数或类,可以对类体中的任何权限成员属性进行操作有好处就有坏处友元函数.友元类严重破坏类的封装性,不到迫不得已不要使用. 二.友元函数 声明部分: friend 返回类型 函数名 (参数列表); 定义部分:返回类型 函数名 (参数列表){        函

  • 简要介绍C++编程中的友元函数和友元类

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来补充介绍一个例外--友元(friend). fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.有的家庭可能会这样处理:客厅对所有来客开放,而卧室除了本家庭的成员可以进人以外,还允许好朋友进入.在C++中,这种关系以关键宇 friend 声明,中文多译为友元.友元可以访问与其有好友关系的类

  • 关于C++中的友元函数的一些总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 1.2使用友元函数的优缺点 1.2.1优点:能够

  • 在C++中关于友元函数的进一步理解

    这里重新将类的成员函数的定义看一下: 百科上的认识: 类的成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型.而函数的定义一般在类外面,也可以直接在类内部定义.前者与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为: 返回值类型 类名 :函数成员名(参数表){函数体}: 而后者一般为一些短小的函数(5行以内),也就是内联函数. 这里在百科上对友元函数的解释: 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数.类授予它的友元特别的访问权.通常同一个开发者会出于技术和

  • 剖析C++编程中friend关键字所修饰的友元函数和友元类

    在某些情况下,为不是类成员的函数或单独类中的所有函数授予成员级别的访问权会更方便.仅类实现器可以声明其友元.函数或类不能将其自身声明为任何类的友元.在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员. 语法 friend class-name; friend function-declarator; 友元声明 如果声明以前未声明的友元函数,则该函数将被导出到封闭非类范围. 友元声明中声明的函数被视为已使用 extern 关键字声明.(有关 ext

  • C++中友元函数(friend)解析

     文章转自公众号:Coder梁(ID:Coder_LT) 我们知道C++控制对象的私有部分的访问,只能通过公共的接口.这样的设计当然没错,但有的时候也会显得过于严格,产生一些问题. 因此C++提供了另外一种形式的访问权限,叫做友元(friend). 友元有三种,分别是友元函数.友元类和友元成员函数. 通过让函数成为类的友元,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在友元函数当中访问类的私有成员变量. 在介绍友元函数的使用之前,我们需要先了解为什么需要友元函数.C++ Prime

  • C++中成员函数和友元函数的使用及区别详解

    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响.封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全. 数据封装引申出了另一个重要的 OOP 概念,即 数据隐藏 .数据封装 是一种把数据和操作数据的函数捆绑在一起的机制, 数据抽象 是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制.C++ 通过创建类来支持封装和数据隐藏(public.protected.p

随机推荐