C/C++:友元函数以及友元类的使用总结

本文深入探讨了C++中友元函数的使用场景与特性,包括其在运算符重载和类间数据共享中的作用,强调了友元函数带来的效率提升与清晰表达,同时也提醒开发者注意其可能破坏封装机制的潜在风险。通过具体的实例代码展示,读者能直观地理解友元函数的使用方式及注意事项。

1、友元函数

实际上具体大概有下面两种情况需要使用友元函数:

    (1)运算符重载的某些场合需要使用友元。

    (2)两个类要共享数据的时候。

     优点:能够提高效率,表达简单、清晰。

      缺点:友元函数破环了封装机制,尽量不使用友元函数。

友元是类的外部函数,所以内部没有this指针;放在类的公有部分或者私有部分没有任何区别

 

友元函数声明:

在类中:

     friend + 返回类型 函数名();

 

友元函数定义:

在类中定义或者在类外部定义

允许外面的类或函数去访问类的私有变量和保护变量。

 

头文件

#ifndef STA_H
#define STA_H
#include <iostream>
using namespace std;
#include <QString>

class Sta;

//函数声明
void print(const Sta &);

class Visit
{
public:
    void show( const Sta&);
};

class Sta
{
public:
    Sta(QString name,int age);

private:
    QString m_name;
    int     m_age;

    //全局函数作为友元函数
    friend void print(const Sta &);
    //类Visit成员函数show作为类的友元函数
    friend void Visit::show(const Sta&);
};


#endif // STA_H

 

//实现文件


#include "sta.h"
#include <QDebug>


Sta::Sta(QString name,int age):
    m_name(name),
    m_age(age)
{

}

//全局函数做类Sta的友元函数
void print(const Sta &s)
{
    qDebug()<<QString("全局函数作为友元打印成员变量")<<endl;
    qDebug()<<s.m_name<<":"<<s.m_age<<endl;
}

//类Visit的成员函数show做类StaDde的友元函数
void Visit::show(const Sta &s)
{
    qDebug()<<QString("成员函数作为友元打印成员变量")<<endl;
    qDebug()<< s.m_name << ":"<<s.m_age;
}


 //测试文件

#include "sta.h"
#include <QTextCodec>

int main()
{
    QTextCodec *codec = QTextCodec::codecForLocale();
    QTextCodec::setCodecForCStrings(codec);

    Sta s(QString("长孙无忌"),1450);
    //调用全局函数打印
    print(s);

    printf("===========================\n");
    Visit vi;
    vi.show(s);
}

效果:


 友元类:

如果类x为类Y的友元类,那么x的多有成员函数为类Y的友元函数。

#ifndef STA_H
#define STA_H
#include <iostream>
using namespace std;
#include <QString>

class Sta;

//函数声明
void print(const Sta &);

class Visit
{
public:
    void show( const Sta&);

private:
    void dis( const Sta &);
};

class Sta
{
public:
    Sta(QString name,int age);

private:
    QString m_name;
    int     m_age;

    //全局函数作为友元函数
    friend void print(const Sta &);

    //声明类Visit为类Sta的友元类
    friend Visit;
};


#endif // STA_H

#include "sta.h"
#include <QDebug>


Sta::Sta(QString name,int age):
    m_name(name),
    m_age(age)
{

}

//全局函数做类Sta的友元函数
void print(const Sta &s)
{
    qDebug()<<QString("全局函数作为友元打印成员变量")<<endl;
    qDebug()<<s.m_name<<":"<<s.m_age<<endl;
}

//友元类Visit的成员函数输出类Sta对象的成员变量
void Visit::show(const Sta &s)
{
    //私有函数dis也称为了类Sta的友元
    dis(s);
    qDebug()<<QString("成员函数作为友元打印成员变量")<<endl;
    qDebug()<< s.m_name << ":"<<s.m_age;
}

void Visit::dis(const Sta &s)
{
    qDebug()<<QString("在私有函数中输出类Sta的对象的属性")<<endl;
    qDebug()<<s.m_name <<":"<<s.m_age<<endl;
    printf("===================================\n");
}


 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值