zoukankan      html  css  js  c++  java
  • C++的友元类和友元函数实例

     1 #include <math.h>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 class Point
     6 {
     7 public:
     8     Point(double xx, double yy)
     9     {
    10         x=xx;
    11         y=yy;
    12     }
    13     void Getxy();
    14     friend double Distance(Point &a, Point &b);        //类Point的友元函数
    15     friend class You;                //类Point的友元类
    16 private:
    17     double x, y;
    18 };
    19 
    20 
    21 class You
    22 {
    23 public:
    24     double Multi(Point &a)
    25     {
    26         return a.x * a.y + 1;
    27     }
    28 };
    
    32 void Point::Getxy()
    33 {
    34     cout<<"("<<x<<","<<y<<")"<<endl;
    35 }
    36 double Distance(Point &a, Point &b)            //类Point的友元函数
    37 {
    38     double dx = a.x - b.x;
    39     double dy = a.y - b.y;
    40     return sqrt(dx*dx+dy*dy);
    41 }
    42 int main(void)
    43 {
    44     Point p1(3.0, 4.0), p2(6.0, 8.0);
    45     p1.Getxy();
    46     p2.Getxy();
    47     double d = Distance(p1, p2);            //Distance是类Point的友元函数,不是成员函数
    48     cout<<"Distance is "<<d<<endl;
    49     You you;
    50     d = you.Multi(p1);
    51     cout<<"Math.Multi is "<<d<<endl;
    52     return true;
    53 }

    为什么会有友元函数?

    结合着类的特性和类中一般成员函数,我们可以这样理解:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有 成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该 看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。

    为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但 它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的 作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

    友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样.

  • 相关阅读:
    导入myeclipse项目出现的问题及解决方案
    sqlserver允许远程连接的配置
    Microsoft SQL Server,附加数据库 错误:Error 916解决方法
    [svc]linux常用手头命令-md版-2017年11月12日 12:31:56
    [elk]es增删改查最佳实战
    [docker]docker日志驱动记录nginx日志情形探究
    [js]面向对象2
    [js]面向对象1
    [js]js中函数传参判断
    [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践
  • 原文地址:https://www.cnblogs.com/winfu/p/5717155.html
Copyright © 2011-2022 走看看