zoukankan      html  css  js  c++  java
  • C++——友元

    友元

    生活中你的家有客厅(Public),有你的卧室(Private)

    客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去

    但是呢,你也可以允许你的好闺蜜好基友进去。

    在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术

    友元的目的就是让一个函数或者类 访问另一个类中私有成员

    友元的关键字为 friend

    友元的三种实现

    • 全局函数做友元
    • 类做友元
    • 成员函数做友元

    1 全局函数做友元

    class Building
    {
    	//告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
    	friend void goodGay(Building * building);
    
    public:
    
    	Building()
    	{
    		this->m_SittingRoom = "客厅";
    		this->m_BedRoom = "卧室";
    	}
    
    
    public:
    	string m_SittingRoom; //客厅
    
    private:
    	string m_BedRoom; //卧室
    };
    
    
    void goodGay(Building * building)
    {
    	cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    	cout << "好基友正在访问: " << building->m_BedRoom << endl;
    }
    
    
    void test01()
    {
    	Building b;
    	goodGay(&b);
    }
    
    int main(){
    
    	test01();
    
    	system("pause");
    	return 0;
    }
    

    2 类做友元

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Building;
    class GoodGay
    {
    public:
    
    	GoodGay();
    
    public:
    
    	void visit();//参观函数,访问Building中的属性
    
    	Building *building;//building是一个指针
    };
    
    class Building
    {
    	//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
    	friend class GoodGay;
    
    public:
    
    	Building();
    
    public:
    
    	string m_SittingRoom;
    
    private:
    
    	string m_BedRoom;
    
    };
    //类外实现类内的函数
    Building::Building()
    {
    	m_SittingRoom = "客厅";
    	m_BedRoom = "卧室";
    }
    
    GoodGay::GoodGay()
    {
    	building = new Building;//使用new时返回的是一个地址,需要一个指针来接收
    }
    
    void GoodGay::visit()
    {
    	cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    	
    	cout << "好基友正在访问: " << building->m_BedRoom << endl;
    }
    
    void test01()
    {
    	//Building b;
    
    	GoodGay gg;
    
    	gg.visit();
    }
    
    int main() {
    
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    

    3 成员函数做友元

    #include <string>
    #include <iostream>
    using namespace std;
    
    class Building;
    class GoodGay
    {
    public:
    	GoodGay();
    
    	void visit();//让visit函数可以访问类Building中的私有变量
    
    	void visit2();//让visit函数不可以访问类Building中的私有变量
    
    	Building *building;
    };
    
    class Building
    {
    	//告诉编译器  goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
    	friend void GoodGay::visit();
    public:
    	Building();
    
    	string m_SittingRoom;
    
    private:
    	string m_BedRoom;
    };
    
    //类外实现成员函数
    GoodGay::GoodGay()
    {
    	building = new Building;
    }
    
    void GoodGay::visit()
    {
    	cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    		
    	cout << "好基友正在访问: " << building->m_BedRoom << endl;
    }
    
    void GoodGay::visit2()
    {
    	cout << "好基友正在访问: " << building->m_SittingRoom << endl;
    
    	//cout << "好基友正在访问: " << building->m_BedRoom << endl;
    }
    
    Building::Building()
    {
    	m_SittingRoom = "客厅";
    	m_BedRoom = "卧室";
    }
    
    void test01()
    {
    	GoodGay gg;
    	gg.visit();
    	gg.visit2();
    }
    int main()
    {
    	test01();
    
    	system("pause");
    
    	return 0;
    }
    
    吾生也有涯,而知也无涯
  • 相关阅读:
    hdu 4476 Cut the rope (2-pointer && simulation)
    hdu 1286 找新朋友 (容斥原理 || 欧拉函数)
    函数存储的另一种思路
    grunt 入门 应用grunt对代码进行压缩
    sublime flatLand 主题
    如何应用r.js对requirejs下的js代码合并
    如何在requirejs下引用bootstrap
    学习在requirejs下如何使用underscore.js模板
    应用js函数柯里化currying 与ajax 局部刷新dom
    js 函数arguments一种用法
  • 原文地址:https://www.cnblogs.com/daimasanjiaomao/p/13777718.html
Copyright © 2011-2022 走看看