在C++中关于友元函数的进一步理解

 更新时间:2018年12月14日 09:42:50   作者:Struggler09  
今天小编就为大家分享一篇关于在C++中关于友元函数的进一步理解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

这里重新将类的成员函数的定义看一下:

百科上的认识:

类的成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型。而函数的定义一般在类外面,也可以直接在类内部定义。前者与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为:

  • 返回值类型 类名 :函数成员名(参数表){函数体};
  • 而后者一般为一些短小的函数(5行以内),也就是内联函数。

这里在百科上对友元函数的解释:

友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。

1.为什么要使用友元函数

优点:能够提高效率,表达简单、清晰。

也有缺点:破坏了程序的封装性。有时候不到万不得已的时候才使用。

代码解释:

#include <iostream>
#include <string>
using namespace std;
class ca {
  string id;
  void setId(string s) {
    id = s;
  }
protected:
  string name;
  void setName(string s) {
    name = s;
  }
public:
  void print() {
    cout << id << " " << name << " " << endl;
  }
  friend void fun(ca& a);  //申明全局函数作友元,允许它访问私有保护成员
};
class derive : public ca { };  //ca类的派生类
void fun(ca& a) {    //作友元的函数要定义在那个类的后面
  a.id = "987";    //这是ca类的私有成员
  a.setName("xyz");  //这是ca类的保护成员
}
int main ( )
{
  ca a;
  //a.fun(...);  //友元函数不是当前类的成员函数,所以这句编译出错
  fun(a);
  a.print();
  derive d;
  fun(d);  //作参数时,类型转换为ca类
  d.print();
  return 0;
}

运行结果:

987  xyz
987  xyz

在就是友元函数的位置:可以在类外或者类内

声明方式:friend+普通函数声明

实现方式:像普通函数那样直接调用

还有一点的是:其实一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须滴。(这就像我学的那个坐标类,直接用操作符重载,声明友元函数)

最后一个知识点:

友元函数和类的成员函数的区别:

1.成员函数有this指针,而友元函数没有this指针。

2.友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 浅析C++字节对齐容易被忽略的两个问题

    浅析C++字节对齐容易被忽略的两个问题

    今天我就和大家分享一下C++字节对齐容易被忽略的两个问题。以下问题也是我实际开发工作中遇到的,如果有不同意见欢迎交流
    2013-07-07
  • c++递归实现n皇后问题代码(八皇后问题)

    c++递归实现n皇后问题代码(八皇后问题)

    c++递归实现n皇后问题代码分享,大家参考使用吧
    2013-12-12
  • C++流操作之fstream用法介绍

    C++流操作之fstream用法介绍

    这篇文章详细介绍了C++流操作之fstream的用法,有需要的朋友可以参考一下
    2013-09-09
  • Window10下安装VS2022社区版的实现步骤(图文教程)

    Window10下安装VS2022社区版的实现步骤(图文教程)

    很多和同学们在接触c语言的时候都是使用VS,本文主要介绍了Window10下如何安装VS2022社区版的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • windows消息和消息队列实例详解

    windows消息和消息队列实例详解

    这篇文章主要介绍了windows消息和消息队列实例详解,详细讲述了Windows的消息机制与原理,对于深入理解和学习Windows应用程序设计有不错的借鉴价值,需要的朋友可以参考下
    2014-10-10
  • 实现去除c语言注释的小工具

    实现去除c语言注释的小工具

    这篇文章主要介绍了实现去除c语言注释的小工具,说是C语言,但其实所有C语系的都可以,比如Java,需要的朋友可以参考下
    2014-02-02
  • C/C++中的静态变量注意事项

    C/C++中的静态变量注意事项

    本文主要介绍了C/C++中的静态变量注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++实现LeetCode(17.电话号码的字母组合)

    C++实现LeetCode(17.电话号码的字母组合)

    这篇文章主要介绍了C++实现LeetCode(17.电话号码的字母组合),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++实现LRU缓存的操作方法

    C++实现LRU缓存的操作方法

    LRU是一种常用的缓存淘汰策略,主要目的是在缓存空间有限的情况下,优先淘汰那些最长时间没有被访问的数据项,这篇文章主要介绍了C++实现LRU缓存,需要的朋友可以参考下
    2024-07-07
  • C语言深入分析数组指针和指针数组的应用

    C语言深入分析数组指针和指针数组的应用

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-04-04

最新评论