友元函数

友元函数

友元函数在类里面声明,但是他更相当于一个全局函数

在类里public或者private 或者protected里面定义没有影响

友元函数可以在类外面访问类的私有变量

 

举个栗子

看一下使用方法

class Test
{
private:
        int private_i;
        friend int read_priv(Test &t,int i);    //友元函数声明
public:
        Test(int i);
};

Test::Test(int i)
{
        this->private_i = i;
}

//友元函数定义
int read_priv(Test &t,int i)
{
        t.private_i += i;       //修改私有变量
        return t.private_i;
}

int main(int argc, char const *argv[])
{
        Test test1(1);
        cout<<read_priv(test1,5)<<endl;
}

声明友元函数:在函数前面加一个 friend 关键字,其余部分和普通函数一样

定义友元函数:完全和普通函数一样,不需要使用类的域符号

调用友元函数:和普通函数一样

 

友元类

class Test
{
private:
        int private_i;
        friend class Cakk;      //Cakk为Test的友元类
        friend int read_priv(Test &t,int i);    //友元函数声明
public:
        Test(int i);
};

Test::Test(int i)
{
        this->private_i = i;
}

//友元函数定义
int read_priv(Test &t,int i)
{
        t.private_i += i;       //修改私有变量
        return t.private_i;
}

//友元类
class Cakk
{
private:

public:       
        int read_test_priv(Test &testn)
        {
          testn.private_i++;
return testn.private_i; } }; int main(int argc, char const *argv[]) { Test test1(1); cout<<read_priv(test1,5)<<endl; Cakk cak; cout<<cak.read_test_priv(test1)<<endl; }

在基类 Test 里面声明了一个友元类 Cakk ,友元类里所有的函数都是友元函数,所以这个类里的函数可以修改基类私有值

友元关系是单向的,A是B的友元类,反过来B不一定是A的友元类

友元关系不能传递,A是B的友元类,C是A的友元类,C和B不一定会有什么关系。

 

posted @ 2020-04-08 15:17  祁峰_1024  阅读(225)  评论(0编辑  收藏  举报