C++温习---友元

基本概念

       友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元函数在实现类之间数据共享时,可以减少系统开销,调高效率。比如:类A中的函数需要访问类B中的成员,那么类A中该函数要是类B的友元函数。友元函数允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

       使用友元类时注意:
       (1) 友元关系不能被继承。
       (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
       (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

使用场景
(1)运算符重载的某些场合需要使用友元函数;
(2)两个类要共享数据的时候。

优缺点
(1)优点:能够提高效率,表达清晰、简单;
(2)缺点:破坏了类的封装(尽量不要使用成员函数,除非不得已才使用友元函数)。

示例

(1)友元函数

#include <iostream>

using namespace std;

class Hello{
private:
    int m_data;
public:
    Hello(int data) {
        this->m_data = data;
    }

    ~ Hello() {

    }

    // 友元函数
    friend void friendFun(Hello *h);
};

// 友元函数
void friendFun(Hello *h) {
    cout<< h->m_data <<endl;
}

int main()
{
    Hello *h = new Hello(8);

    friendFun(h);

    if(h!=nullptr) {
        delete h;
        h = nullptr;
    }
    return 0;
}

(2)友元类

#include <iostream>

using namespace std;

class Hello{
private:
    int m_data;
public:
    Hello(int data) {
        this->m_data = data;
    }

    ~ Hello() {

    }

    // 友元函数
//    friend void friendFun(Hello *h);
    // 友元类
    friend class World;
};

// 友元函数
//void friendFun(Hello *h) {
//    cout<< "friend funtion " << h->m_data <<endl;
//}

// 友元类
//class Hello;
class World{
private:
public:
    void readHelloMsg(Hello *h) {
        cout<< "friend class " << h->m_data<<endl;
    }

};

int main()
{
//    Hello *h = new Hello(8);

//    friendFun(h);

//    if(h!=nullptr) {
//        delete h;
//        h = nullptr;
//    }

    Hello *h1 = new Hello(100);

    World d;

    d.readHelloMsg(h1);

    if(h1!=nullptr) {
        delete h1;
        h1 = nullptr;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我啥都会

如果觉得对您有帮助,打赏一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值