面向对象(C++) 之 友元函数

背景:在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。为了解决上述问题,提出一种使用友元的方案。

△友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。

☆友元函数的参数:
因为友元函数没有this指针,则参数要有三种情况:
要访问非static成员时,需要对象做参数;
要访问static成员或全局变量时,则不需要对象做参数;
如果做参数的对象是全局对象,则不需要对象做参数;

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

☆友元函数和类的成员函数的区别:
成员函数有this指针,而友元函数没有this指针。
友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

以下为一个例子:

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

class CTyre{
    private:
        int radius;
        int width;
    public:
        CTyre(){ cout<<"CTyre contructor"<<endl;}
        ~CTyre(){ cout<<"CTyre destructor"<<endl;}
        //友元函数的声明(在类中)
        friend void CCar(const int &radius,const int &width);
};//别忘了分号

 //友元函数的定义(在类外)
void CCar(int &radius,int &width)
        {
            cout<<"汽车轮胎的半径为:"<<radius<<endl; 
            cout<<"汽车轮胎的厚度为:"<<width<<endl;
        }

int main(){
    int tr,tw;
    cout<<"请输入汽车轮胎的半径:"<<endl;
    cin>>tr;
    cout<<"请输入汽车轮胎的厚度:"<<endl;
    cin>>tw;
    CCar(tr,tw);    
    return 0;
}
作者:华中师范大学 计算机学院 蒲东齐
文本作者才疏学浅,如有错误,请指正!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,146评论 1 51
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,151评论 0 50
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 7,951评论 0 3
  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 10,438评论 0 14
  • 简书启航录 缘分的巧合 ,让我们相聚,去点缀回忆的灿烂。纯粹的情感, 携牵着唯一的心动。你我瞬间的永恒, 交织着彼...
    阳光下的妃子阅读 3,093评论 0 0