c++类——友元

友元

友元是什么是干嘛的

首先在我们写类的过程中我们会有一些的私有属性或者受保护的属性,我们不让外界访问,只让自己的public公有接口来访问,这个详见前面的bok“类的初始”然后这个时候我们想让外界的一个函数或者是类可以访问到我们的这个私有成员或者是受保护的程序,那我们应该怎么办呢?这时候我们就想起来了,如果是一个陌生人,你肯定是不会让他来你家的对吧,那谁可以来你家呢?肯定是你认识的人你的好朋友才能访问对吧?
所以加上friend但是要记住这个只是单项的,你可以对一个类设立了一个friend对象,你允许了它访问你,但是如果他没有friend你,你就没法访问它

全局函数做友元

代码直接上
第一个如果我不使用友元会出现是什么情况:

#include<bits/stdc++.h>
using namespace std;
class wallet
{
protected:
    int money;//一个受保护的成员让人轻易访问不了
public:
    wallet()//构造函数
    {
        money=100;//假设我现在有100元
    }

};
//设立一个全局的函数
void visit(wallet *wal)
{
    cout<<"money"<<wal->money<<endl;
}
int main()
{
    wallet wal;
    visit(&wal);//因为我们的函数里面是指针我们要把我们的这个地址传进去
    return 0;
}

但是运行后会发现出现不对劲
在这里插入图片描述
出现了,他来了,他来了,他带着错误走来了
接下来让我们快乐的来一下friend
上代码:

#include<bits/stdc++.h>
using namespace std;
class wallet
{
protected:
    int money;//一个受保护的成员让人轻易访问不了
public:
    wallet()//构造函数
    {
        money=100;//假设我现在有100元
    }
    friend void visit(wallet *wal);
};
//设立一个全局的函数
void visit(wallet *wal)
{
    cout<<"money="<<wal->money<<endl;
}
int main()
{
    wallet wal_1;
    visit(&wal_1);
    return 0;
}

在这里插入图片描述
这个就是简单而快乐的一个全局函数作为友元,很快乐,很简单,自己多多复现!!!

类做友元

这个根据上面的那个我们理解一下子,什么是类作为友元,那就是 我们在这个类里面把另一个类设成友元,然后我们不就是可以直接在这个类里面直接调用另一个类,然后另一个类里面的所有东西不就是都可以访问了吗
多说无益直接上代码:

#include<bits/stdc++.h>
using namespace std;
class node
{
protected:
    int num,sum;
public:
    node():num(10),sum(100){}
    friend class visit;
};
class visit
{
protected:
    node ans;
public:
    void test()
    {
        cout<<"num="<<ans.num<<endl;
        cout<<"sum="<<ans.sum<<endl;
    }
};
int main()
{
    visit a;
    a.test();
    return 0;
}

直接水过,当然也可以使用指针的方式

#include<bits/stdc++.h>
using namespace std;
class node
{
protected:
    int num,sum;
public:
    node():num(10),sum(100){}
    friend class visit;
};
class visit
{
protected:
    node *ans;
public:
    visit()
    {
        ans=new node;
    }
    void test()
    {
        cout<<"num="<<ans->num<<endl;
        cout<<"sum="<<ans->sum<<endl;
    }
};
int main()
{
    visit a;
    a.test();
    return 0;
}

类的函数做友元

这个也是可以直接根据字面去理解,什么是类的函数做友元,就是一个类里面的函数跟另一个类成为了好朋友,它可以随意访问另一个类
直接上代码理解:

#include<bits/stdc++.h>
using namespace std;
class base;
class visit
{
protected:
    base * ans;
public:
    visit();
    void showtime();
};
class base
{
protected:
    string name;
public:
    base();
    friend void visit::showtime();
};
base::base()
{
    this->name="godhands";
}
visit::visit()
{
    ans=new base;
}
void visit::showtime()
{
    cout<<"name="<<ans->name<<endl;
}
int main()
{
    visit vv;
    vv.showtime();
    return 0;
}

这个我自我感觉这个的坑非常之多,首先这个如果有提前声明的东西的话,参见-

https://blog.csdn.net/xiaozhu2hao/article/details/18659991
借鉴一下
类或结构体的前向声明只能用来定义指针对象或引用,因为编译到这里时还没有发现定义,不知道该类或者结构的内部成员,没有办法具体的构造一个对象,所以会报错。
将类成员改成指针就好了。 程序中使用incomplete type实现前置声明有助与实现数据的隐藏。要求调用对象的程序段只能使用声明对象的引用或者指针。
在显式声明异常规范的时候不能使用incomplete type。

这个时候你就得是使用指针或者是引用,我这里使用的是这个指针来实现的这个赋值操作,及其调用的操作,然后伙伴们可以试试把两个类颠倒他也是会报错,然后紧接着就是函数的声明问题了,这个着实是让我头疼了一会儿
而我超级懒蛋的把所有类的函数写在了外面,然后进行操作,都写在最后,可以避免很多的定义问题

最后认识一下,我来自godhands

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值