重温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++之友元类

什么是友元类当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。友元类能做什么友元类可以通过自己的方法来访问把它当做朋友的那个类的所有...

C++ Primer Plus学习之友元异常及其他

友元关系        类的友元关系除了函数外,还可以定义友元成员函数,友元类来对相关类进行访问。        而友元声明可以位于公有、私有或者保护部分,其所在的位置无关紧要。        ...

c++ primer 学习笔记:类之友元

友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成...

C++之友元

一、友元类     类并非只能拥有友元函数,也可以将类作为友元;但什么时候会希望一个类称为另一个类的友元呢,我们来看一个例子,如果要编写一个模拟电视机和遥控器的简单程序,决定定义一个Tv类和Remo...

C++之友元函数和友元类

在介绍类和对象时,已经说过类具有封装性,类中的私有成员一般只有通过该类中的成员函数才可以访问,而程序中的其他函数时无法直接访问类中的私有成员的。如果在一定的条件下需要访问类的私有成员,就必须通过对象来...

C++之友元:友元函数和友元类

C++之友元:友元函数和友元类 一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种...

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元 一、友元介绍 我们知道,类的成员函数可以访问同类的其他...

从零开始学C++之友元:友元函数和友元类

一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数...

MyC++之友元

友元可以函数也可以是类,我更愿意把它当成一个访问权限的关系。它使得一些非类成员函数有权利对该类的私有成员或保护型成员进行访问,不过这个权限是别人赋予的。   友元包括友元函数和友元类,声明格式无非...

C# 之友元程序集

C#中的访问修饰符Internal可以说是介于Public和Private之间,可以使类型在同程序集中可以被互相访问。但有时会有这样的需求,我们希望一个程序集中的类型可以被外部的某些程序集可以访问,这...
  • zyy5411
  • zyy5411
  • 2011年10月11日 16:55
  • 566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重温C++语法之友元
举报原因:
原因补充:

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