C++查漏补缺读书笔记一 友元(friend)

原创 2013年12月06日 11:22:15

像我这样工作2年多了,号称拥有2年C++经验,但其实如果细细的考察一番,恐怕对C++的掌握远远不及十分之一。其实这也是很多程序员的现状,只是觉得能够及解决问题,能够完成项目就OK,如果抱着这种态度,我想十年都不会有进步的。正是基于这种恐惧,我决定把自己再回炉一番,把基础再巩固一遍,查漏补缺。

在这一系列查漏补缺的文章中,我会把平时容易忽视,容易犯错,不好理解的知识点做一些总结归纳,把书本中讲述太简单的知识点做一些阐述。

既然是查漏补缺嘛,大家平时接触较多的东西就不累述了,总之,力求精简有用。



有元(friend)

对于大多数新手C++程序员,这是一个几乎不会用到的特性,而我们理解它也仅仅是为了看懂大神们的代码!记得上学时老师跟我们讲,最好不要用到这些容易出错不好掌握的特性,所以我们也像抛弃goto一样抛弃了它。其实“存在即合理”,既然它依旧存在于C++中,肯定是大有用处的。

知识要点:原书中感觉例子不是很清楚,自己在下面重新阐述了。

必须先定义包含成员函数的类,才能将成员函数设为友元。另一方面,不必预先声明类和非成员函数来将它们设为友元。

解释:例如下面代码要先定义Y,才能在x中设Y为友元。但是在test文件中不用包含Y的头文件

友元声明将已命名的类或非成员函数引入到外围作用域中。

解释:下列x将Y设为友元,所以x的外围作用域中的class z也可以直接使用Y 而不用包含头文件来声明Y。

友元函数可以在类的内部定义,该函数的作用域扩展到包围该类定义的作用域

解释:代码中的f(x xx)定义在x内部,但它的作用于和Y一样,也可以被z使用。f()和普通的非类成员函数的区别是f()可以访问x的私有成员a;

file  Y.h
class Y
{
	int i;
};
file tes.h
class x
{
friend class Y;
friend int f(x xx){return xx.a;}//它可以访问到x的私有成员
private:
	int a;
};
int f(x xx);
class z
{
Y *ymem;
x *xmem;
int g(){return ::f(*xmem);}
};

类必须将重载函数集中每一个希望设为友元的函数都声明为友元:

解释:如果一个将一个函数设为友元,并不意味着把它的重载函数也设为了友元。例如friend void fun();并不意味着重载函数fun(int a, int b)也是友元

对 friend关键字来讲,重载是无效的,如果你希望所有的重载函数都友元,那就都friend一边吧!


友元的继承,一句话友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。

如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

请看下面链接,该文中犯了一点小错,友元针对的是private属性而言的,看看评论就知道呢

http://blog.csdn.net/shandianling/article/details/7469361





基础知识

“在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的”这句话阐述了友元的作用,就是为了访问私有成员嘛!

友元有2种形式,文章将友元分为“友元函数”“友元类”,而其中友元函数则又分为“类的友元函数”“非类的有原函数”

友元类:将一个类声明为其他类的友元,此类可以访问被友元类的私有成员

class Screen
{
      // Window_Mgr members can access private parts of class Screen
      friend class Window_Mgr;
};
类的友元函数:将一个类(A)的函数(f()) 作为其他类(B)的友元,那么在这个类中仅仅只有A::f()可以访问B中的私有成员

class Screen 
{
         // Window_Mgrmust be defined before class Screen
         friend Window_Mgr&  Window_Mgr::relocate(Window_Mgr::index,  Window_Mgr::index,  Screen&);
};
当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。




相关文章推荐

C++查漏补缺读书笔记二 static关键字

本节对static关键字的一些容易忽视的细节做些笔记 1 在成员声明前加上关键字 static 将成员设为 static。static 成员遵循正常的公有/私有访问规则。 注:虽说static成员...

C++查漏补缺读书笔记三 指针与引用,动态绑定与静态绑定

本节本想说的是动态绑定,结果发现这个指针和引用的区别有必要也复习一下 动态绑定与静态绑定 静态绑定:编译时绑定,通过对象调用。 动态绑定:运行时绑定,通过地址实现。并且只对虚函数有效。 所以...

【读书笔记:C++ primer plus 第六版 中文版】第15章 友元、异常和其他

转载请注明出处:本章内容包括: 友元类 友元类方法 嵌套类 引发异常,try块和catch块 异常类 运行阶段类型识别(RTTI) dynamic_cast和typeid static_cast,co...

C++ 友元(friend)

问题的提出  我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是假如将数据成员都定义为公有的,这又...

C++ 友元 friend

原文: http://www.cnblogs.com/CBDoctor/archive/2012/02/04/2337733.html  友元是指: 采用类的机制后实现了数据的隐藏与封装,类...

C++ - 模板函数需要类型转换时使用友元(friend)模板函数

模板函数需要类型转换时使用友元(friend)模板函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24357301 非...

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

将数据和处理数据的函数封装在一起,构成类,实现了数据的隐藏,无疑是面向对象程序设计的一大优点。但是有时候封装不是绝对的。 友元函数提供了不同类或对象的成员函数之间、类的成员函数和一般函数之间进行数据共...

c++基础积累 友元friend的使用

通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用frien...
  • yhhwatl
  • yhhwatl
  • 2013年08月18日 10:01
  • 613

C++ - 类模板(class template)友元(friend) 的 全部六种形式 及 代码

类模板(class template)友元(friend) 的 全部六种形式 及 代码   版权所有, 禁止转载, 如有需要, 请站内联系; 本文地址: http://blog.csdn.net/ca...

effective C++ 读书笔记

  • 2014年11月20日 11:07
  • 261KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++查漏补缺读书笔记一 友元(friend)
举报原因:
原因补充:

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