c++中友元函数理解与使用。

原创 2017年01月03日 17:09:52

在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点。
首先讲友元函数。

(1)友元函数:

1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意外)访问的窗口;
2)这个友元函数他不属于该类的成员函数,他是定义在类外的普通函数,只是在类中声明该函数可以直接访问类中的private或者protected成员。

使用友元函数声明的一般形式:

friend <返回类型> <函数名> (<参数列表>);

使用友元函数注意的要点:

  1. 类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定。
  2. 一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
  3. 友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
  4. 友元函数在调用上同一般函数一样,不必通过对对象进行引用。

例如如下形式:这里解释上面的1,3,4要点的使用,加以理解。

#include <iostream>
#include <cstring>
using namespace std;

class persion{
public:
      persion(char *pn);

      //友元函数;
      friend void setweigth(persion &p,int h);//注意,参数列表中一般会有一个引用类型的形参,原因参考上面的使用要点3和4;
      void disp(); //类成员函数
private:
      char name[20];
      int weigth,age;      
};

persion::persion(char *pn)   //构造函数
{
   strcpy(name,pn);
   weigth=0;
}
void persion::disp()
{
cout<<name<<"--"<<weigth<<endl;
}


//友元函数的具体实现:这里没有类限定例如 (perion::setweigth)这种形式,这里可以与上面的disp()做个对比,一个属于类的成员,有限定,不属于类的成员函数,没有加限定。
void setweigth(persion &pn,int w)
{
strcpy(pn.name,pn);//实现字符串复制
pn.weigth=w;       //私有成员数据赋值

}

void  main()
{
  persion p("zhansan");
  //调用实现setweigth(),与一般函数调用一致。
  setweigth(p,60);

  p.disp();  //调用类的成员函数。

}

关于要点2的使用,我给出一段代码案例:

#include <iostream>
#include <cstring>
using namespace std;

class wheel;
class car{
public:
    car(char *pn);
    void run(wheel &w);    //成员函数,做成wheel类中友元函数实现
private:
    char name[20];

};
car::car(char *pn)
{
strcpy(name,pn);
}

class wheel{
public:
    wheel(int s);
    friend void car::run(wheel &w);   //这里把car类的成员函数做了友元函数。
private:
    int speed;
};
wheel::wheel(int s)
{
  speed=s;
}
int  main(int argc, char const *argv[])
{
    wheel w(60);
    car c("New car");
    c.run(w);
    return 0;
}

void car::run(wheel &w)   //car类成员函数的实现
{
    cout<<"the car is running"<<endl;
    cout<<"name: "<<name<<" speed :"<<w.speed<<endl;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

C++_友元函数

1、为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率       具体来说:为了使其他类的成员函数直接访问该类的私有变量       即:允许外面的类或函数去访问类的私有变量和...
  • insistGoGo
  • insistGoGo
  • 2011年07月15日 15:17
  • 30807

友元(友元函数、友元类和友元成员函数) C++

有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。 友元(frend)机制允许一个类将...
  • u012796139
  • u012796139
  • 2015年06月07日 21:34
  • 3450

C++中的friend友元函数详细解析 http://www.jb51.net/article/41776.htm

C++中的friend友元函数详细解析 作者: 字体:[增加 减小] 类型:转载 时间:2013-09-29 我要评论 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该...
  • wangyin159
  • wangyin159
  • 2015年12月20日 10:24
  • 460

C++之:友元函数

一、定义 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得...
  • Scythe666
  • Scythe666
  • 2016年03月10日 21:28
  • 1253

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

1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数...
  • zhouwei1221q
  • zhouwei1221q
  • 2015年08月24日 16:48
  • 521

STL面试题二

http://wiki.xyzp.net/index.php?title=Moto%E7%AC%94%E8%AF%95%E9%A2%98%E7%9B%AE-STL/C%2B%2B%E9%9D%A2%E...
  • etwdone
  • etwdone
  • 2013年03月25日 15:50
  • 4487

C++ friend template operator overload function

在之前实现矩阵类的时候,遇到了一个问题,当时使用非成员函数重载来调用类成员函数实现了输出,这样就避开了之前的错误。后来看到了类似的问题,弄清楚了之前为什么错了。现在就总结一下错误原因和几种解决方法。问...
  • yc461515457
  • yc461515457
  • 2016年04月25日 10:19
  • 477

C++中友元(友元函数和友元类)的用法和功能

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的...
  • adriano119
  • adriano119
  • 2010年09月29日 15:54
  • 54281

C++中友元类使用场合

在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员。与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员。 声明友元类的方法很简单,只需在类中...
  • Rongbo_J
  • Rongbo_J
  • 2015年04月17日 10:48
  • 3657
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++中友元函数理解与使用。
举报原因:
原因补充:

(最多只允许输入30个字)