C++学习笔记-友元理论详解

原创 2016年08月30日 19:24:31

友元、友元类、友元函数知识点总结

 

1、什么是友元?

 

由于有了类这样的机制,实现了数据的隐藏和封装,也就是说累的一般成员被定义为私有成员,成员函数一般被定义为公有的,

类内部的成员函数可以访问类中的私有成员,这样就实现了数据的隐藏。但是这样出现了一个问题,有时候需要定义

一个类外部的函数,但是这个函数又需要经常的访问类中的数据成员,这时候将这些函数定义为该函数的友元函数,就能够实

非类内部的函数访问类中的私有成员


友元实现了外部函数可以访问类内部私有成员的目的,但是它破坏了类的封装性和隐藏性。

那么这样更加灵活的方式是程序员在工程中根据需要而选择使用的。


所以没有一个规则是完美的,只有用在和合适的地方规则才是最贴切的。

 

2、友元函数

//友元函数可以访问类的私有变量也可以访问私有函数

2.1、直接定义在类的内部

class mywindow

{

    MainWindow *p;

 

    void friend showwindow(mywindow *pwin)

    {

        pwin->p = new MainWindow;

        pwin->p->show();

    }

};


2.2、 声明在类的内部,需要加上friend,定义在类的外部,不需要加上friend

class mywindow

{

    MainWindow *p;

 

    void friend showwindow(mywindow *pwin);

};

void showwindow(mywindow *pwin)

{

    pwin->p = new MainWindow;

    pwin->p->show();

}

 

注意:

1)友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
2)、一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2)、友元函数的调用与一般函数的调用方式和原理一致。

 

3、友元类


       友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。       
       当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
       friend class 类名;
       其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。

       例如,以下语句说明类B是类A的友元类:
       class A
       {
              …
       public:
              friend class B;
              …
       };
       经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。

       使用友元类时注意:
             (1) 友元关系不能被继承。 
             (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
             (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

友元的优点:

使得累的封装这个密不透风的墙,有了条件性的通道——在友元情况下,可以访问这面墙内部的私有成员;

友元的缺点:

破坏了封装性;

 

思想方法:

如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门

访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。


参考:http://blog.csdn.net/adriano119/article/details/5914443

版权声明:本文为博主原创文章,欢迎转载。转载请注明出处http://blog.csdn.net/jobbofhe

c++友元实现操作符重载

运算符重载的本质是一个函数#include using namespace std;class A { private: int m_a; int m_b; friend A ...
  • sjtu_chenchen
  • sjtu_chenchen
  • 2015年08月22日 16:14
  • 1890

C++中模板类的友元重载

一个由《程序员面试宝典》引出的问题。 描述模板类的友元重载,用C++代码实现? 这实际上考察的是下面几个问题: 1.模板类的编写 2.模板类中友元函数的编写 3.什么时候会用到友元重载?答案...
  • u012501459
  • u012501459
  • 2015年03月10日 16:41
  • 1742

C++类模板友元声明的几种情况

根据《C++ Primer》第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数。 书上给了一个例子: class Foo{     void bar(); }...
  • hqz1989
  • hqz1989
  • 2014年03月24日 11:32
  • 1859

为什么要引入友元机制

【一】为什么引入友元机制?     总的来说就是为了让非成员函数即普通函数或其他类可以访问类的私有成员,这确实破坏了类的封装性和数据的隐蔽性,但为什么要这么做呢? (c++ primer:尽管友元...
  • pipinuan
  • pipinuan
  • 2016年10月18日 13:47
  • 803

C++ 运算符流操作符重载和友元--笔记

/************************************************************************************************ *...
  • JarvisChu
  • JarvisChu
  • 2011年07月23日 20:57
  • 5620

C++中的友元——编程界的老王

c++中友元类可以访问类的所有域,简直是编程世界的老王。
  • qyvlik
  • qyvlik
  • 2015年08月09日 13:13
  • 962

友元关系和继承

问题:在c++primer(中文第四版)第15.2.6节,讲了友元关系在类继承上的有效性,其中注解部分强调:        (1)友元关系不能继承。(2)基类的友元对派生类的成员没有特殊的访问权限。(...
  • shiquxinkong
  • shiquxinkong
  • 2013年12月09日 19:57
  • 1063

C++运算符重载(注意点),友元(使用和优缺点)

运算符重载实例代码class A{ public: int a,b; A(int _a=0,int _b=0):a(_a),b(_b){} A operator+(A & tm...
  • qq_26437925
  • qq_26437925
  • 2016年12月26日 19:12
  • 445

C++之嵌套类与外围类及友元

class Outer { public: Outer(){m_outerInt=0;} private: int m_outerInt; public: //内部类定义开始 ...
  • gettogetto
  • gettogetto
  • 2016年05月11日 17:14
  • 598

c++ 友元关系与继承

//友元关系的双向都是不可继承的 #include class Base{ friend class Frnd; protected: int i; }; class D1 : public ...
  • jianguo_liao19840726
  • jianguo_liao19840726
  • 2013年01月28日 17:07
  • 392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习笔记-友元理论详解
举报原因:
原因补充:

(最多只允许输入30个字)