当前位置:编程学习 > C/C++ >>

C++ 友元函数 友元类

一、整体代码
      01.cpp
[cpp 
#include <math.h>  
#include <iostream>  
using namespace std;  
  
class Point  
{  
    friend double Distance(const Point& p1, const Point& p2);  
public:  
    Point(int x, int y);  
private:  
  
    int x_;  
    int y_;  
};  
  
Point::Point(int x, int y) : x_(x), y_(y)  
{  
  
}  
  
double Distance(const Point& p1, const Point& p2)  
{  
    double dx = p1.x_ - p2.x_;//非友元函数,必须是p1.GetX。  
    double dy = p1.y_ - p2.y_;  
  
    return sqrt(dx*dx + dy*dy);  
}  
  
int main(void)  
{  
    Point p1(3, 4);  
    Point p2(6, 9);  
  
    cout<<Distance(p1, p2)<<endl;  
    return 0;  
}  
 
二、解释友元函数
   1、友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。
   2、友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。
   3、友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性。
 
三、友元类
   TeleController.h
[cpp]  
#ifndef  _TELE_CONTROLLER_H_  
#define _TELE_CONTROLLER_H_  
class Television;//前向声明为了使用Television,也可include但是会造成头文件过大  
class TeleController  
{  
public:  
    void VolumeUp(Television& tv);  
    void VolumeDown(Television& tv);  
    void ChanelUp(Television& tv);  
    void ChanelDown(Television& tv);  
};  
#endif // _TELE_CONTROLLER_H_  
 
   Television.h
[cpp]  
#ifndef _TELEVISION_H_  
#define _TELEVISION_H_  
//class TeleController;//前向声明,避免引用不到TeleController  
class Television  
{  
    friend class TeleController;  
public:  
    Television(int volume, int chanel);  
private:  
    int volume_;  
    int chanel_;  
};  
#endif // _TELEVISION_H_  
~                                              
   Television.cpp
[cpp]  
#include "Television.h"  
Television::Television(int volume, int chanel) : volume_(volume), chanel_(chanel)  
{  
}  
 
   TeleController.cpp
[cpp]  
#include "TeleController.h"  
#include "Television.h"  
void TeleController::VolumeUp(Television& tv)  
{  
    tv.volume_ += 1;//非友元类必须得tv.GetVolume_  
}  
void TeleController::VolumeDown(Television& tv)  
{  
    tv.volume_ -= 1;  
}  
void TeleController::ChanelUp(Television& tv)  
{  
    tv.chanel_ += 1;  
}  
void TeleController::ChanelDown(Television& tv)  
{  
    tv.volume_ -= 1;  
}  
  
    02.cpp
[cpp]  
#include "Television.h"  
#include "TeleController.h"  
#include <iostream>  
using namespace std;  
int main(void)  
{  
    Television tv(1, 1);  
    TeleController tc;  
    tc.VolumeUp(tv);  
    return 0;  
}  
 
四、解释
    1、友元关系是单向的
    2、友元关系不能被传递
    3、友元关系不能被继承
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,