• C++基础之友元


    一、友元函数

    • 友元实际上并不是面向对象的特征,而是为了兼顾C语言程序设计的习惯与C++友元的概念破坏了类的封装性和信息隐藏,但有助于数据共享,能够提高程序执行的效率。信息隐藏的特点,而特意增加的功能。这是一种类成员的访问权限。
    • 友元使用关键字friend标识。在类定义中,当friend出现在函数说明语句的前面时,表示该函数为类的友元函数。一个函数可以同时说明为多个类的友元函数,一个类中也可以有多个友元函数。当friend出现在类名之前时,表示该类为类的友元类。
    • 友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。
    • 友元函数不是类的成员函数,但允许访问类中的所有成员。在函数体中访问对象成员时,必须使用“对象名.对象成员名”的方式。
    #include<iostream>
    using namespace std;
    class Student{
        private:
            int id;
            string name;
        public:
             Student(int id,string name);  
             //声明友元函数
             friend void show(Student &stu);     
    };
    //友元函数的实现(直接可以访问类的私有属性)
    void show(Student &stu){
        cout<< stu.id << " name:" <<stu.name <<endl;
    };
    Student::Student(int id,string name):id(id),name(name){
    
    }
    int main(){
        Student stu(1,"张三");
        show(stu);
        return 0;
    }

    二、友元类

    • 如果将一个类B说明为另一个类A的友元类,则类B中的所有函数都是类A的友元函数,在类B的所有成员函数中都可以访问类A中的所有成员。在类定义中
    • 声明友元类的格式如下:friend class 类名;
    • 友元类的关系是单向的。若说明类B是类A的友元类,不等于类A也是类B的友元类。友元类的关系不能传递,即若类B是类A的友元类,而类C是类B的友元类,不等于类C是类A的友元类。除非确有必要,一般不把整个类说明为友元类,而仅把类中的某些成员函数说明为友元函数。
    #include<iostream>
    using namespace std;
    class Teacher;
    class Student{
        private:
            int id;
            string name;
        public:
             Student(int id,string name);
             void show(Teacher *tea);   
    };
    Student::Student(int id,string name):id(id),name(name){
    
    }
    class Teacher{
        private:
            int id;
            string name;
        public:
            Teacher(int id,string name);  
            //将Student类声明为Teacher类的友元类
            friend class Student;
    };
    Teacher::Teacher(int id,string name):id(id),name(name){
    
    }
    void Student::show(Teacher *tea){
        cout << this->id << this->name << tea->name << endl;
    }
    
    int main(){
        Teacher tea(1,"老外");
        Student stu(1,"张三");
        stu.show(&tea);
        return 0;
    }
  • 相关阅读:
    2017 ICPC 广西邀请赛1004 Covering
    2017 ICPC 广西邀请赛1005 CS Course
    2017-8-23 训练日记
    2017-8-22 训练日记
    2017-8-21 训练日记
    1034: [ZJOI2008]泡泡堂BNB
    1041: [HAOI2008]圆上的整点
    2017-8-19训练日记
    2017-8-18训练日记
    code force 424 A
  • 原文地址:https://www.cnblogs.com/jalja365/p/13031412.html
Copyright © 2020-2023  润新知