重温C++语法之友元

原创 2006年05月16日 22:19:00

  今天下了OpenNurbs(www.opennurbs.org)的最新代码Build了一下,竟然没编译失败, 而且还是语法错误, 心想这堂堂一个优秀开源库的官方网站上下的代码, 竟然有如此低级的错误, 不由的一声冷笑(不敢多笑,这OpenNurbs可是编程与数学的完美组合, 不是一般人能写出来的)。然后看到几个编译错误都是关于友元访问的, 就想把它改改好就行了, 想不到左改右改, 竟然没搞定, 谁是谁的朋友,谁能访问谁,有脑一片混乱。。。。。 没办法, 乖乖的拿出<<The C++ Programming Language>> 查了起来。

  其实C++中友元的规定还是很形象的,假设a要知道b的秘密(private),那么b必须要接受a, 认定a是他的朋友;但是至于a当不当b是朋友, 那就不一定了(怎么可以这样呢:)). 那么在C++中就是如果在b中声明了a为其友元,a就能访问b的私有成员, 但是同时,b还不能访问a的私有成员(因为没有在a中声明b为其友元)。如下:二

class b
{
 friend class a;
public:
 b(){};
 void bf1(){}
protected:
 void bf2(){}
private:
 void bf3(){}
};


class a
{
public:
 a(){b bb;bb.bf1();bb.bf2();bb.bf3();}
 void af1(){b bb;bb.bf1();bb.bf2();bb.bf3();}
protected:
 void af2(){b bb;bb.bf1();bb.bf2();bb.bf3();}
private:
 void af3(){b bb;bb.bf1();bb.bf2();bb.bf3();}
};

当我声明a为b的友元类后, a中的所有类型的函数(public, protected, private)都可以访问b中的任何类型的成员了(public, protected, private).

对于函数, 也是同样的道理,假如函数要访问b中的私有成员, 就要把该函数声明成b的友元:

class b
{
 friend void f1();
public:
 b(){};
 void bf1(){}
protected:
 void bf2(){}
private:
 void bf3(){}
};

void f1()
{
 b bb;
 bb.bf1();
 bb.bf2();
 bb.bf3();
}

函数f1()作为类b的友元, 就有权力访问b的任何成员。当然, 对于成员函数作为友元, 也是一样的做法。

这里我总结出一条: 谁要访问其它类的保护或私有成员, 它就要成为那个类的友元, 在那个类里面声明。 这里这个“谁”可以是一个类, 一个全局函数, 或者一个类的成员函数。

注:

今天在测试时竟然发现可以这现声明成员函数:

class b
{
public:
 b::b(){};
 void b::bf1(){}
};

也就是在成员函数前又加了一次类域, 至少在VC++8可以通过编译, 以前还真没发现。

 

 

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
  • 1888

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

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

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

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

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

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

为什么要引入友元机制

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

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

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

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
  • 441

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

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

C++之派生类的友元

先举个例子:#include using namespace std;class Student{ private: int _a; int _b; public: Stude...
  • maoliran
  • maoliran
  • 2016年06月10日 15:18
  • 483

C++(11):友元、嵌套类

关于“友元”和“嵌套类”一些用法上的说明。
  • qcyfred
  • qcyfred
  • 2016年12月22日 20:50
  • 358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重温C++语法之友元
举报原因:
原因补充:

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