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

 更新时间:2017年06月26日 14:47:43   作者:ab198604  
这篇文章主要介绍了C++ 中友元函数与友元类详解的相关资料,需要的朋友可以参考下

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

总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员。

        友元函数的注意事项:

        (1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用“对象名.对象成员"方式来访问, 友元函数可以访问类中的所有成员(公有,私有,保护),而一般的函数只能访问类的公有成员。

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

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

        (4)友元函数破坏了面向对象设计的封装特性。所以应该尽量少用。

        友元类

        如果某类B的成员函数会频繁地访问类A的数据成员,而类A的数据成员的private/protected限制造成了类B存取的麻烦,B只能通过A的Public的成员函数进行间接存取。这种情况下可以将类B作为类A的友元类,即类A向类B提供私有和保护成员的访问权限,让类B可以直接存取。

        友元类中的所有成员函数均可以看作是另一类的友元函数。

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

        下面是友元函数的例子

        友元函数可以在类中声明,声明时在函数前增加friend关键字,然后在类体外定义,也可以直接在类中声明定义。这两种方式均可。下面例子中采取的是类中声明,类体外定义的方式。

class Point 
{ 
  friend double Distance(const Point &p1, const Point &p2); //类体中声明 
 
public: 
  Point(int x, int y):x_(x), y_(y) 
  {}; 
 
private: 
  int x_; 
  int 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() 
{ 
  Point p1(3,4); 
  Point P2(6,8); 
  cout << Distance(p1,p2) << endl; 
 
  return 0; 
} 

        下面是友元类的例子:      

class Television //电视类 
{ 
  friend class TeleController;//友元类声明 
   
public: 
  Television(int volume, int chanel): volume_(volume), chanel_(chanel){} 
 
private: 
  int volume_; //音量 
  int chanel_; //频道 
}; 
 
class TeleController //遥控器类 
{ 
public: //类中的每个成员函数都是电视类的友元函数,都可以访问电视类的私有数据成员 
  void VolumeUp(Television &tv) 
  { 
    tv.volume_ += 1; //音量加1 
  } 
 
  void VolumeDown(Television &tv) 
  { 
    tv.volume_ -= 1; 
  } 
 
  void ChanelUp(Television &tv) 
  { 
    tv.chanel_ += 1; //频道加1 
  } 
 
  void ChanelDown(Television &tv) 
  { 
    tv.chanel_ -= 1; //频道减1 
  } 
}; 
 
 
int main() 
{ 
  Television tv(1,1); 
  TeleController tc; 
  tc.ChanelUp(tv); 
  return 0; 
} 

        友元类需要注意以下几点:

        (1)友元关系是单向的; 

        (2) 友元关系不能被传递: A是B的友元,B是C的友元,则A是C的友元,这种传递不成立

        (3) 友元关系不能继承:   A是B的友元,A的派生类C也是B的友元,这是不成立的。

         感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • C++ 多线程编程建议之 C++ 对多线程/并发的支持(下)

    C++ 多线程编程建议之 C++ 对多线程/并发的支持(下)

    这篇文章主要介绍的是 C++ 多线程编程建议之 C++ 对多线程/并发的支持的相关资料,承接前文 现代 C++ 对多线程/并发的支持,接下来我们看看回发生什么吧
    2021-10-10
  • 详解C语言中fseek函数和ftell函数的使用方法

    详解C语言中fseek函数和ftell函数的使用方法

    这篇文章主要介绍了C语言中fseek函数和ftell函数的使用方法,两个函数分别用于设置和返回文件指针stream的位置,需要的朋友可以参考下
    2016-03-03
  • 基于C语言实现推箱子游戏

    基于C语言实现推箱子游戏

    这篇文章主要为大家详细介绍了基于C语言实现推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C++封装远程注入类CreateRemoteThreadEx实例

    C++封装远程注入类CreateRemoteThreadEx实例

    这篇文章主要介绍了C++封装远程注入类CreateRemoteThreadEx实例,详细讲述了注入DLL到指定的地址空间以及从指定的地址空间卸载DLL的方法,需要的朋友可以参考下
    2014-10-10
  • C++数据结构之堆详解

    C++数据结构之堆详解

    本文详细讲解了C++数据结构之堆,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 函数指针的一些概念详解

    函数指针的一些概念详解

    首先看函数指针的语法,举一个最简单的例子,要创建一个函数指针,则它与它指向的函数,在参数个数类型以及返回值上都保持一致,跟重载的要求应该是一样的
    2013-09-09
  • C语言实现信号槽的项目实践

    C语言实现信号槽的项目实践

    信号槽是观察者模式的一种实现,一个信号就是一个能够被观察的事件,本文主要介绍了C语言实现信号槽的项目实践模具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • C语言下快速排序(挖坑法)详解

    C语言下快速排序(挖坑法)详解

    大家好,本篇文章主要讲的是C语言下快速排序(挖坑法)详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言实现班级成绩管理系统

    C语言实现班级成绩管理系统

    这篇文章主要为大家详细介绍了C语言实现班级成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C/C++中for语句循环用法以及练习举例

    C/C++中for语句循环用法以及练习举例

    for语句是一种循环语句,它是对while语句的推广,下面这篇文章主要给大家介绍了关于C/C++中for语句循环用法以及练习举例的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03

最新评论