• [cpp]Friend关键字的作用


    Friend Class

    Friend class可以访问别的class中的private和protected成员,只要在这个类中声明了friend。 通常可以使部分类访问其他类中的一些私有成员,例如在链表中,链表class作为节点class的friend,可以访问其私有成员。

    class Node { 
    private: 
    	int key; 
    	Node* next; 
    
    	// 现在 class LinkedList 可以访问Node的私有成员了  
    	friend class LinkedList; 
    }; 
    

    Friend function

    像Friend class一样,friend function可以访问其他类中的private和protected成员,friend function可以是

    • 一个类的方法
    • 全局函数
    class Node { 
    private: 
    	int key; 
    	Node* next; 
    
        //只有LinkedList的search方法可以访问Node的内部成员
    	friend int LinkedList::search(); 
    	
    }; 
    
    

    一些要点

    • 不要滥用friend,这样降低了class的封装性。
    • Friend不是相互的,A是B的Friend,但B不能自动成为A的Friend。
    • Friend关系不能继承。

    Friend class的实例

    #include <iostream> 
    class A { 
    private: 
    	int a; 
    
    public: 
    	A() { a = 0; } 
    	friend class B; // Friend Class 
    }; 
    
    class B { 
    private: 
    	int b; 
    
    public: 
    	void showA(A& x) 
    	{ 
    		//B 是A的Friend,所以可以访问私有成员
    		std::cout << "A::a=" << x.a; 
    	} 
    }; 
    
    int main() 
    { 
    	A a; 
    	B b; 
    	b.showA(a); 
    	return 0; 
    } 
    
    

    Friend method的实例

    #include <iostream> 
    
    class B; 
    
    class A { 
    public: 
    	void showB(B&); 
    }; 
    
    class B { 
    private: 
    	int b; 
    
    public: 
    	B() { b = 0; } 
    	friend void A::showB(B& x); // Friend function 
    }; 
    
    void A::showB(B& x) 
    { 
    	//showB是 B的friend,所以可以访问私有成员
    	std::cout << "B::b = " << x.b; 
    } 
    
    int main() 
    { 
    	A a; 
    	B x; 
    	a.showB(x); 
    	return 0; 
    }
    
    

    Friend global function的实例

    #include <iostream> 
    
    class A { 
    	int a; 
    
    public: 
    	A() { a = 0; } 
    
    	// global friend function 
    	friend void showA(A&); 
    }; 
    
    void showA(A& x) 
    { 
    	//showA是A的Friend function,所以可以访问私有成员。
    	std::cout << "A::a=" << x.a; 
    } 
    
    int main() 
    { 
    	A a; 
    	showA(a); 
    	return 0; 
    }
    
    

    参考

    https://www.geeksforgeeks.org/friend-class-function-cpp/

  • 相关阅读:
    RPC的入门
    Https的实现原理
    Celery
    Flask信号
    Redis安装
    python之递归
    python之三元表达式和生成式
    python第十八天作业
    python之生成器
    python之迭代器
  • 原文地址:https://www.cnblogs.com/WAoyu/p/13157569.html
Copyright © 2020-2023  润新知