C++之友元

在 C++ 中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。

现在,我们来介绍一种例外情况——友元(friend)。借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。

友元函数:

在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。

友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。

1.将非成员函数声明为友元函数

 

#include<iostream>
using namespace std;

class Student{
private:
        char *m_name;
        int m_age;
        float m_score;
public:
        Student(char *name,int age,float score);
        friend void show(Student *pstu);
};

//使用初始化列表,在函数体内无需操作
Student::Student(char *name,int age,float score):m_name(name),m_age(age),m_score(score){
        //TODO
}

void show(Student *pstu){
        cout<<pstu->m_name<<",age:"<<pstu->m_age<<",score:"<<pstu->m_score<<endl;
}

int main()
{
        Student stu("Ming",24,98);
        show(&stu);
        Student *pstu= new Student("xu",28,89);
        show(pstu);
        return 0;
}

 

sh不属于任何类,按理来说,m_name,m_age和m_score属于类的private成员变量,在show里面是不可以被访问的,声明了友元函数就可以了。

注意,友元函数不同于类的成员函数,在友元函数中不能直接访问类的成员,必须要借助对象。下面的写法是错误的:

void show(){
    cout<<m_name<<"的年龄是 "<<m_age<<",成绩是 "<<m_score<<endl;
}

2.

//todo

友元类:

如果A类中,声明B类为友元类,则B类可以访问A类的私有成员函数

#include <iostream>

class A{
    
    private:
        int m_a_mem;
        
    public:
        void set(){
            m_a_mem = 11;
        }
         friend class B;
};

class B{
    
    private:        
        int m_b_mem;
        
    public:        
        void show(A* obj){
            std::cout << obj->m_a_mem << std::endl;
        }    
};


int main(int argc, char** argv) {
    A a;
    a.set();
    B b;
    b.show(&a);
}

 

 

posted @ 2020-07-02 15:22  njit-sam  阅读(422)  评论(0)    收藏  举报