雪千渔Blog

  • 首页
  • 写写代码
    • dotNet
    • C++
    • Lua
    • Visual Basic
    • Java
    • Android
    • Web
  • DCC
    • Maya
    • Maya-Plug
    • AfterEffect
    • AfterEffect-Plug
    • PhotoShop-Plug
  • 游戏制作
    • Unity3D
    • UnrealEngine
    • 经验杂谈
    • 游戏设计
    • 自研引擎
    • 效果实现
  • 其他
    • 乱七八糟
    • 软件工具
    • 留言板
    • 自制素材
    • 关于我
雪千渔blog
唯有热爱,能抵漫长岁月
  1. 首页
  2. Coding
  3. C++
  4. 正文

C++友元少见用法:友元函数的定义内联

2022年7月25日 553点热度 0人点赞 0条评论

在cpp学习初期大多是通过博客文章以及视频教程等途径学习,但示例总是最基础的那两种写法,今天发现了一种c++少见的友元写法,并对函数进行了一个重新理解,尝试着写出了一个实例。

class A
{
    int a_;
    friend void fun(A a)
    {
        a.a_;
    }
};

这个函数看上去很像一个该类的成员函数,在众多学习资料中友元函数和友元类的实例并没有出现过该种情况,于是我翻阅了cppreference的friend参考页,其中给出了一个示例

class X
{
    int a;
 
    friend void friend_set(X& p, int i)
    {
        p.a = i; // this is a non-member function
    }
public:
    void member_set(int i)
    {
        a = i; // this is a member function
    }
};

看样子像是在一个成员函数前添加friend时,将函数就会从成员函数变为全局函数。但实际上我们只是将一个友元函数的定义内联进了类中。

但为什么不将这个函数写在全局空间而是内联到类中,而且可能还会看错成成员函数的问题呢?

一般这个内联友元汗水定义中,至少有一个形参为该类型,这样函数可以直接访问该类型中的私有成员,看起来就像是成员函数一样,但它实际是一个全局函数。可以直接调用这个函数并传参,因c++支持函数重载,所以这么写其实是让某个全局函数有自己的重载版本,是一种类似模板特化的实现。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: cpp
最后更新:2022年7月25日

JomiXedYu

IndieGame Developer & Netease Games TechArt

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

JomiXedYu

IndieGame Developer & Netease Games TechArt

最新 热点 随机
最新 热点 随机
UE材质Custom节点与HLSL的HACK操作 UE5出现D3D12崩溃报错解决方案 游戏引擎脚本绑定的三种写法与利弊 一种解决不支持中文与空格文件名的编码 Vulkan坐标系通用方案以及反转viewport UE编辑器开发之蓝图篇
一种解决不支持中文与空格文件名的编码游戏引擎脚本绑定的三种写法与利弊UE5出现D3D12崩溃报错解决方案UE材质Custom节点与HLSL的HACK操作
AfterEffect 渲染设置模板与输出模块模板 Aria2+AriaNG搭建远程下载服务器 Unity尾随渐变式打字机特效 Lua位运算与Flag枚举 通过命令行启动Maya时执行MEL和Python脚本 Visual Basic6使用Cmd命令行创建Res资源文件
友情链接
  • DorinXL
  • 小博博客
  • 秋橘斋

COPYRIGHT © 2014-2023 雪千渔Blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

辽ICP备20006894号-1