1、什么是友元函数?

友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数。

一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字friend。因为我们的一个外部函数是无法访问一个类的私有数据的,当然可以访问

public修饰的变量,这就不叫私有数据了。

1、友元全局函数

(1)首先说明友元全局函数首先他是一个普通的全局函数,其次他是一个的类的友元函数,也就是意味着我们可以通过友元函数

访问类的私有数据和成员函数,当然首先这个友元函数的参数是一个这个类的引用、类的指针或者就是这个类对象。

(2)声明全局友元函数如下所示:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Time{
  5. friend void func(Time &t); // 声明全局函数为一个友元函数
  6. public:
  7. Time(int h, int m, int s) : i_mHour(h), i_mMin(m), i_mSecon(s) { } // 构造函数
  8. private:
  9. int i_mHour;
  10. int i_mMin;
  11. int i_mSecon;
  12. };
  13.  
  14. static void func(Time &t) // 全局函数
  15. {
  16. cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl;
  17. }
  18.  
  19. int main(void)
  20. {
  21. Time t = {, , };
  22. func(t);
  23. return ;
  24. }

全局友元函数

2、友元成员函数

(1)首先说明友元成员函数是一个类的成员函数,其次他是另一个类的友元函数,所以我们也可以在这个函数中访问这个类的私有数据和成员函数

(2)声明友元成员函数如下所示:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Time;
  5.  
  6. class Print{
  7. public:
  8. void func(Time &t); // func函数是Time类的友元函数
  9. };
  10.  
  11. class Time{
  12. friend void Print::func(Time &t); // 声明Print类中的func函数是Time类的友元函数
  13. public:
  14. Time(int x, int y, int z) : i_mHour(x), i_mMin(y), i_mSecon(z) { }
  15. private:
  16. int i_mHour;
  17. int i_mMin;
  18. int i_mSecon;
  19. };
  20.  
  21. void Print::func(Time &t)
  22. {
  23. cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl; // 直接操作Time中的私有数据
  24. }
  25.  
  26. int main(void)
  27. {
  28. Time t(,,);
  29. Print p;
  30. p.func(t);
  31. return ;
  32. }

友元成员函数

3、友元类

(1)友元类就是在A类中将B类声明为A类的友元类,方法就是:friend 类名

(2)代码如下:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Print;
  5.  
  6. class Time{
  7. friend Print; // 声明Print类为Time类的友元类
  8. public:
  9. Time(int x, int y, int z) : i_mHour(x), i_mMin(y), i_mSecon(z) { } // 构造函数
  10. private:
  11. int i_mHour;
  12. int i_mMin;
  13. int i_mSecon;
  14. };
  15.  
  16. class Print{
  17. public:
  18. Print(int x, int y, int z) : t(x, y, z) { } // 构造函数
  19. void func(void); // 可以在这个函数中去操作Time对象t的私有数据
  20. private:
  21. Time t; // 申明一个Time类对象
  22. };
  23.  
  24. void Print::func(void)
  25. {
  26. cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl; // 直接操作Time中的私有数据
  27. }
  28.  
  29. int main(void)
  30. {
  31. Print p(,,); // 定义一个Print类对象
  32. p.func();
  33. return ;
  34. }

友元类

3、注意一些问题

(1)在类中声明的友元函数或者是友元类与类限定符没有任何关系,因为友元函数并不属于这个类,所以类的修饰限定符并不能对他起作用

  1. class Time{
  2. friend void func1(Time &t); // 一般申明在类的开头位置处
  3. ......
  4. public:
  5. friend void func2(Time &t); // 申明在public下
  6. ......
  7. private:
  8. friend void func3(Time &t); // 申明在private下
  9. ......
  10. protected:
  11. friend void func4(Time &t); // 申明在protected下
  12. ......
  13. };

友元与限定符

(2)成员函数有this指针,而友元函数没有this指针。

(3)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友,这个其实很好理解,也很合理。

(4)友元关系的单向性

A是B的友元,B不是A的友元

(5)友元声明的形式及数量不受限制

我们可以声明多个类的友元函数或者友元类,而且函数可以是一个运算符重载函数,也可以是其他的什么函数。

(6)友元只是封装的补充,其实是破坏了类的封装特性,所以我们如果能够不是用的情况尽量不要去使用。

C++友元函数、友元类的更多相关文章

  1. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  2. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...

  3. c++友元函数友元类

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

  4. C++开发系列-友元函数 友元类

    友元函数 默认一个类的私有属性只能在该类的内部可以直接访问.友元函数申明在内的内部,实现在类的外部可以直接访问类的私有属性. class A1 { public: A1() { a1 = 100; a ...

  5. C++学习之友元类和友元函数

    C++学习之友元类和友元函数       模板类声明也可以有友元,模板的友元可以分为以下几类:        1.非模板友元:        2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...

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

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

  7. mfc 类的友元函数

    知识点 友元函数 友元函数 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数..类授予它的友元特别的访问权.通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你 ...

  8. 【C++基础 05】友元函数和友元类

    友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...

  9. C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数

    C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...

随机推荐

  1. FastAdmin Bootstrap-table 特定某行背景变红

    FastAdmin Bootstrap-table 特定某行背景变红 rowStyle: function (row, index) { var style = {css:{'background': ...

  2. oracle 之 安装10.2.0.1 且 升级到 10.2.0.4

    一. centos 6.5 安装 oracle 10.2.0.1 1.安装操作系统,选择桌面环境 2.配置本地yum源 , 可参考 http://blog.csdn.net/zhang12345645 ...

  3. Phonegap 工程项目介绍

    一.工程项目的路径在www下面,www下面的文件如下图 1. index.html <!DOCTYPE html> <!-- Licensed to the Apache Softw ...

  4. 【free() invalid next size】谨慎地在C++的类中存储指针来方便访问其他节点

    “我跟你们说,你们知道STL容器,vector/string/deque等等,都有个reserve方法吗?你们一个个地push_back,嫌C++比C慢,怪谁?” “要像我这样,预先分配足够大的空间, ...

  5. 配置 host only 后 nat不能上网了

    如果只有nat 网关为nat 中设置的网关  eth0 启动第二块网卡host_only 网关就变成了 host_only中的网关  eth1 解决放法 route -n 看启用的是哪个网关 [roo ...

  6. Javamail使用代码整理

    package com.hengrun.mail; import java.io.*; import java.security.Security; import java.text.SimpleDa ...

  7. charles手机抓包配置-1

    1.下载和安装Charles 下载和安装Charles软件.安装前要先安装Java运行环境,因为Charles是Java写的. 自己百度云上有破解版 2.安装电脑的Charles证书,对证书进行信任设 ...

  8. 学习笔记之Tips for Macbook

    写给Mac新手的入门指南 - 威锋网 https://mp.weixin.qq.com/s/pqmqGZhNwevx57KeLnzZmg https://bbs.feng.com/read-htm-t ...

  9. app crawler1

    app crawler简介 执行 java -jar appcrawler-2.1.3.jar 查看相关参数 -a, --app Android或者iOS的文件地址, 可以是网络地址, 赋值给appi ...

  10. 【CentOS 6.5】【转】新版本linux生成xorg.conf

    新版本的linux如何生成xorg.conf 较新版本的linux系统都已经没有xorg.conf文件,但是有时候为了对显示做微调或为了支持多屏显示等原因,还需要手工生成一个xorg.conf,然后根 ...