zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    知乎神回复:代码之间为什么要加空格?这个问题我是这样理解的!
    经验分享:一个 30 岁的人是如何转行做程序员,进入IT行业的?
    对于程序员来说,学历真的重要吗?为何都是高学历混的风生水起?
    教材、教参、教案有哪些区别?
    教参是什么
    教师面试指要
    教师资格证结构化面试是什么?会怎么考查?
    教师资格证面试试讲时可以戴手表吗
    讲师面试流程及试讲指导
    教师资格面试:试讲和说课的区别
  • 原文地址:https://www.cnblogs.com/jalja365/p/13031412.html
Copyright © 2011-2022 走看看