C++编程法则100条friend友元函数

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++编程法则100条friend友元函数相关的知识,希望对你有一定的参考价值。

🥇 关于博主👇🏻👇🏻👇🏻

👀 作者简介: 热衷于知识探索和分享的技术博主。
💂 csdn主页::【奇妙之二进制
✍️ 微信公众号:【Linux 世界

🎉精彩专栏:

   💪 【C++编程法则100条
   🎓 【面向工作git基础教程
​   🧡 【C++11新特性深入剖析
​   📚 【shell脚本编程基础与实战
​   🌎 【Linux网络编程面试
   ✍️ 【C++编译工具cmake入门到精通
   🤩 【Linux文本处理三剑客
   😉 【C++模板编程
   🥰 【VIM实用指南
   🔥 【Linux C/C++编译链接和调试调优
   ✨ 【面向对象分析和设计
   🎉 【Ubuntu/Linux系统管理
   🤔 【C/C++笔面试精选
   ✔️ 【Linux并发编程面试与实战
   🚀 【C/C++常用开源库实战
   😊 【Linux常用命令详解
​ …

💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。 然而,对于技术的探索和追求从未停歇。 💪坚持创作,热衷分享,初心未改,继往开来!

文章目录

定义

friend关键字用于将函数(可以是普通函数,类成员函数,甚至是构造、析构函数)或者类声明为类的朋友,作为朋友,它可以直接访问类的私有和保护成员,公有成员自然不必说。

换言之,friend打破了权限访问控制的限制,也有人说friend破坏了数据的封装。

class Y

    int data; // private member
 
    // the non-member function operator<< will have access to Y's private members
    friend std::ostream& operator<<(std::ostream& out, const Y& o);
    friend char* X::foo(int); // members of other classes can be friends too
    friend X::X(char), X::~X(); // constructors and destructors can be friends
;
 
// friend declaration does not declare a member function
// this operator<< still needs to be defined, as a non-member
std::ostream& operator<<(std::ostream& out, const Y& y)

    return out << y.data; // can access private member Y::data

通常在类里面书写friend声明,在类外补充实现。当然,如果是普通函数,也可以直接在声明为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有几个特点

  • 无法传递,朋友的朋友不是朋友
  • 朋友的儿子不是朋友

友元的常见用途

友元经常用于操作符重载函数,在某些场景下,操作符重载函数不能是类的成员函数,例如cout << "xx";。因为成员函数的第一个参数默认是this指针,像cout<< “xx”,操作符<<的第一个参数是cout对象。

#include <iostream>
#include <sstream>
 
class MyClass

    int i;                   // friends have access to non-public, non-static
    static inline int id6; // and static (possibly inline) members
 
    friend std::ostream& operator<<(std::ostream& out, const MyClass&);
    friend std::istream& operator>>(std::istream& in, MyClass&);
    friend void change_id(int);
public:
    MyClass(int i = 0) : i(i) 
;
 
std::ostream& operator<<(std::ostream& out, const MyClass& mc)

    return out << "MyClass::id = " << MyClass::id << "; i = " << mc.i;

 
std::istream& operator>>(std::istream& in, MyClass& mc)

    return in >> mc.i;

 
void change_id(int id)  MyClass::id = id; 
 
int main()

    MyClass mc(7);
    std::cout << mc << '\\n';
//  mc.i = 333*2;  // error: i is a private member
    std::istringstream("100") >> mc;
    std::cout << mc << '\\n';
//  MyClass::id = 222*3;  // error: id is a private member
    change_id(9);
    std::cout << mc << '\\n';

关于friend和模板的结合,在模板编程这个专栏介绍。

以上是关于C++编程法则100条friend友元函数的主要内容,如果未能解决你的问题,请参考以下文章

C++编程法则100条(11)关于&&&修饰成员函数的含义

C++ 友元

Java里有没有友元函数这回事

黑马程序员 C++教程从0到1入门编程笔记4C++核心编程(类和对象——封装权限对象的初始化和清理构造函数析构函数深拷贝浅拷贝初始化列表友元friend运算符重载)

C++ 友元函数 友元类 friend class

C++ friend关键字