作为其他类的成员函数的友元函数不是成员函数能反问友元类的私有数据

C++友元类的声明及使用方法
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
C++友元类的声明及使用方法
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。=======================什么是友元类=======================
&&&&& 当一个类B成为了另外一个类A的&朋友&时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。
=======================友元类能做什么=======================
&&&&& 友元类可以通过自己的方法来访问把它当做朋友的那个类的所有成员。但是我们应该注意的是,我们把类B设置成了类A的友元类,但是这并不会是类A成为类B的友元。说白了就是:甲愿意把甲的秘密告诉乙,但是乙不见得愿意把乙自己的秘密告诉甲。
=======================友元类的声明方法和其用法=======================
&&&&& 声明友元类的方法其实很简单,只要我们在类A的成员列表中写下如下语句:
friend class B;
默认情况下子类不能调用基类protected成员。但如果想调用的话可以使用友元方法,
方法是在基类加前 friend class+子类名。
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved友元函数和友元类
友元函数和友元类
&&&&&&&&采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
&&&&&&友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
&&&&&&friend&
类型 函数名(形式参数);
&&&&&&友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
&&&&&&一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
&&&&&&友元函数的调用与一般函数的调用方式和原理一致。
&&&&&&友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。&&&&&&&
&&&&&&当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
&&&&&&friend
class 类名;&&&&&&其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
&&&&&&例如,以下语句说明类B是类A的友元类:
&&&&&&class
&&&&&&&&&&&&&…
&&&&&&public:
&&&&&&&&&&&&&friend
class B;&&&&&&&&&&&&&…
&&&&&&经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
&&&&&&使用友元类时注意:
&&&&&&&&&&&&(1)&友元关系不能被继承。&
&&&&&&&&&&&&(2)&友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
&&&&&&&&&&&&(3)&友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。以下试题来自:
单项选择题下列关于友元的描述中,错误的是(
)A.友元函数可以访问该类的私有数据成员B.一个类的友元类中的成员函数都是这个类的友元函数C.类与类之间的友元关系可以继承D.友元可以提高程序的运行效率
为您推荐的考试题库
你可能感兴趣的试题
1A.复制构造函数是一种特殊的构造函数,函数名与类名相同B.若自定义派生类的复制构造函数,那么也必须自定义基类的复制构造函数C.复制构造函数只能有一个参数D.复制构造函数不允许在函数体中使用refurn语句2A.this指针一定指向常量型数据 B.this指针指向的数据不可更改C.静态成员函数中也可以访问this指针 D.this指针本身可直接作为成员函数的返回值3A.类中定义的运算符函数B.同一个名字,参数个数不同C.派生类中重新定义了一个和基类中的原型完全相同的函数D.类中定义了两个同名、同参数表的函数,但其中一个是常成员函数4A.构造函数可以设置默认的参数 B.构造函数在定义类对象时自动执行C.构造函数可以是内联函数 D.构造函数不可以重载
热门相关试卷
最新相关试卷读书笔记(16)
& & & & 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的。例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。
& & & &&友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。
1、友元函数
& & 友元函数是指某些虽然不是类成员函数却能够访问类的所有成员的函数。类授予它的友元特别的访问权,这样该友元函数就能访问到类中的所有成员。
#include &iostream&
friend void set_show(int x, A &a);
//该函数是友元函数的声明
void set_show(int x, A &a)
//友元函数定义,为了访问类A中的成员
cout && a.data &&
int main(void)
set_show(1, a);
& & & &&友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
关于友元类的注意事项:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
#include &iostream&
friend class C;
//这是友元类的声明
//友元类定义,为了访问类A中的成员
void set_show(int x, A &a) { a.data = cout&&a.data&&}
int main(void)
c.set_show(1, a);
3、友元成员函数
& & & & 使类B中的成员函数成为类A的友元函数,这样类B的该成员函数就可以访问类A的所有成员了。
& & & & 当用到友元成员函数时,需注意友元声明和友元定义之间的相互依赖,在该例子中,类B必须先定义,否则类A就不能将一个B的函数指定为友元。然而,只有在定义了类A之后,才能定义类B的该成员函数。更一般的讲,必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。
#include &iostream&
//当用到友元成员函数时,需注意友元声明与友元定义之间的互相依赖。这是类A的声明
void set_show(int x, A &a);
//该函数是类A的友元函数
friend void B::set_show(int x, A &a);
//该函数是友元成员函数的声明
void show() { cout && data && }
void B::set_show(int x, A &a)
//只有在定义类A后才能定义该函数,毕竟,它被设为友元是为了访问类A的成员
cout && a.data &&
int main(void)
b.set_show(1, a);
友元小结:
& & & & 在需要允许某些特定的非成员函数访问一个类的私有成员(及受保护成员),而同时仍阻止一般的访问的情况下,友元是可用的。
& & & & 可以灵活地实现需要访问若干类的私有或受保护的成员才能完成的任务;
& & & &&便于与其他不支持类概念的语言(如C语言、汇编等)进行混合编程;
& & & &&通过使用友元函数重载可以更自然地使用C++语言的IO流库。
& & & &&一个类将对其非公有成员的访问权限授予其他函数或者类,会破坏该类的封装性,降低该类的可靠性和可维护性。
参考资料:
1、《C++ Prime》第4版 第12章类的友元小节
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45266次
积分:1568
积分:1568
排名:第19972名
原创:111篇
转载:15篇
文章:12篇
阅读:4963
(2)(7)(4)(10)(18)(3)(5)(2)(8)(9)(3)(1)(6)(2)(1)(4)(7)(17)(15)(2)(2)4852人阅读
// win32Test.cpp : Defines the entry point for the console application.
#include &stdafx.h&
&int fun(A& one)
&&//表达式1:错误
&&//return one.fun(this);
&&//表达式2:错误,cannot convert parameter 1 from 'class A *const ' to 'class A &'
&&//m_iX = fun(this);
&&//return m_iX;
&&//表达式3:正确
&&int* const pX = &one.m_iX;
&int m_iX;
&//const B& b1;//正确,可以这样声明,类的成员变量可以是常引用,但是在构造函数必须初始化
&//B& b2;//正确,可以这样声明,类的成员变量可以是常引用,但是在构造函数必须初始化
&int Get(B& b)
&&return b.m_iY;//正确,类的内部可以直接访问私有变量
&int Get()
&&return m_pOne-&m_iY;//正确,类的内部可以直接访问私有变量
&friend int global_getB(B& b);//定义成友元函数
&int m_iY;
int global_getB(B& b)//全局函数
&return b.m_iY;//正确,友元函数可以直接访问私有变量
&friend class D;
&C* GenFun()
&&return new C();//可以通过友元类的方式创建对象C
//C++访问类的私有成员变量的方法:
//方法1:set/get接口
&int get() const {}
&void set(int k) {i =}
//方法2:友元类
&friend class G;
&int get()
&&return f.i;
//方法3:友元函数
&friend int global_getH(H& h);
int global_getH(H& h)
&return h.i;
int main(int argc, char* argv[])
&//B& b3;//错误,不可以这样定义,必须初始化
&//C//错误,类c的构造函数是私有的,必须通过静态函数或者友元的方法来实例化对象
&return 0;
两道问答题:
//在声明类中的构造函数、析构函数、纯虚函数、静态成员函数、非静态的成员函数以及全局函数作为类的友元函数时,哪些可以是常量成员函数?
//只有纯虚函数、非静态的成员函数可以是常量成员函数。
//(这题有点问题,析构函数可以是纯虚函数,但不能是常量函数)
//1、声明带有 const 关键字的成员函数指定,函数是 “只读”函数,在它被调用的时候不会修改对象。一个常数成员函数不能修改任何非静态数据成员或调用不是常数的任何成员函数。
//若要声明常数成员函数,请在参数列表的右括号后放置const关键字。声明和定义中均要求该const关键字。
//2、构造函数和析构函数为了生成和释放成员变量,显然不能是const。
//3、静态成员函数不能是常量成员函数的原因:
//(1)const成员函数是包含this指针的。这明显不被static函数允许。
//(2)因为static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象。
//(3)const针对对象才有意义。const是基于对象的;static 是基于类的。
//4、全局函数作为类的友元函数时,它是定义在类外的普通函数,并不属于类的成员函数。
//通常类A的拷贝构造函数的原型写为A(const A&);,请问为什么参数一定要使用引用形式?使用const修饰符除了可以防止修改传递给构造函数的实参外,还有什么作用?
//A(const A& one ).当调用此拷贝构造函数时,需将参数压栈,若不使用&,就需要在栈内创建一个one的副本,而这需要用拷贝构造函数。这样就会形成递归调用。
//使用const,还允许用一个常量对象作为样本,来构造一个新的对象。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:890349次
积分:7994
积分:7994
排名:第1870名
原创:137篇
转载:240篇
评论:97条
(1)(2)(4)(1)(2)(5)(5)(31)(22)(21)(8)(20)(24)(31)(22)(19)(1)(10)(13)(34)(7)(8)(6)(8)(15)(22)(9)(23)(2)}

我要回帖

更多关于 友元成员函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信