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");
}