友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend。

友元不是成员函数,可是它能够訪问类中的私有成员。

友元的作用在于提高程序的执行效率。可是,它破坏了类的封装性和隐藏性,使得非成员函数能够訪问类的私有成员。

有两种形式的友元:

(1)友元函数:普通函数对一个訪问某个类中的私有或保护成员。

(2)友元类:类A中的成员函数訪问类B中的私有或保护成员。



友元函数:

在类声明的不论什么区域中声明,而定义则在类的外部。

friend <类型><友元函数名>(<參数表>);  

演示样例:

class A
{
public:
A(int _a):a(_a){}; friend int getA_a(A &_classA);//友元函数 private:
int a;
}; int getA_a(A &_classA)
{
return _classA.a;//通过对象名訪问私有变量
} int _tmain(int argc, _TCHAR* argv[])
{
A _classA(3);
std::cout<<getA_a(_classA);//友元函数仅仅是普通函数。能够在随意地方调用
return 0;
}

须要注意的是:

(1)友元函数不是类成员函数,没有this指针。

(2)友元函数是类外的函数。所以它的声明能够放在类的私有段或公有段且没有差别。

(3)友元函数仅仅是一个普通函数,并非该类的类成员函数,它能够在不论什么地方调用,友元函数中通过对象名来訪问该类的私有或保护成员。

友元类:

能够理解为:类B的全部成员函数都为类A的友元函数,则类B为类A的友元类。

friend class <友元类名>;  

演示样例:

class girl;

class boy

{
public:
  void disp(girl &);
}; void boy::disp(girl &x) //函数disp()为类boy的成员函数。也是类girl的友元函数
{
  cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接訪问girl的私有变量
} class girl
{
private:
  char *name;
  int age;
  friend boy; //声明类boy是类girl的友元
};

须要注意的是,友元类没有继承性和传递性

(1)没有继承性:假如类B是类A的友元,类C继承于类A,那么友元类B是没办法直接訪问类C的私有或保护成员。

(2)没有传递性:假如类B是类A的友元,类C是类B的友元,那么友元类C是没办法直接訪问类A的私有或保护成员,也就是不存在“友元的友元”这样的关系。

【C++基础 05】友元函数和友元类的更多相关文章

  1. C++语言基础(15)-友元函数和友元类

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...

  2. C++学习12 友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  3. C++:友元(非成员友元函数、成员友元函数、友元类)

    3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...

  4. 友元(友元函数、友元类和友元成员函数) C++

    有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...

  5. c++友元函数与友元类

    友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...

  6. C++ friend友元函数和友元类(转)

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...

  7. 2.19 C++友元函数和友元类

    参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属 ...

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

    通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. #include<iostream>using namespace std; ...

  9. C++中的友元函数和友元类

    C++中的友元函数主要应用于以下场景: 友元函数 第一种场景 代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的publ ...

随机推荐

  1. Ruby的DevKit名词解释

    为了加快运行速度,Ruby下好多扩展包都是用C语言写的二进制包,如果我们要安装就要重新编译,DevKit包主要就是将编译用的工具链打包,解决了众多依赖问题,方便了群众. 但是,在实际安装中,可能还会遇 ...

  2. windows performance

    blogs.technet.com/b/perfguide/archive/2010/09/28/the-microsoft-pfe-performance-guide-start-here.aspx

  3. 一文读懂什么是Java中的自动拆装箱

    基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为 ...

  4. Lintcode记录

    汇总贴 56. Two Sum[easy] 167. Add Two Numbers[easy] 53. Reverse Words in a String[easy] 82. Single Numb ...

  5. C++ 11 创建和使用 shared_ptr

    shared_ptr 的类型是C + +标准库中一个聪明的指针,是为多个拥有者管理内存中对象的生命周期而设计的.在你初始化一个 shared_ptr 后,你可以复制它,把函数参数的值递给它,并把它分配 ...

  6. 每日英语:Our Unique Obsession With Rover And Fluffy

    Recently, an almost literal case of lifeboat ethics occurred. On Aug. 4, Graham and Sheryl Anley, wh ...

  7. Kafka Consumer 启动测试类

    https://github.com/MarcoGhise/SpringKafka.git package it.demo.kafka.springkafka.listener; import org ...

  8. Java中常见的异常__

    作为一名游戏开发者,程序员,很自然必须熟悉对程序的调试方法.而要调试程序,自然需要对程序中的常见的异常有一定的了解,这些日子很多朋友都提出了很多问题,都是关于游戏中的报错,因此在这里我将一些常见的程序 ...

  9. Maven学习之(一)基本配置

    安装maven还几次没成功,不过最后还是查资料成功了,所以记录一下. 1.安装JDK,比较简单,就不说明了. 2.配置java的环境变量 JAVA_HOME (最开始因为java配置成C:\Progr ...

  10. C语言实现单链表(不带头结点)节点的插入

    对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...