C++ 友元(十九)

咱们一起学C++第八十九篇:之C++友元机制深入剖析与嵌套友元 在C++学习的道路上,我们共同努力,不断深入理解这门语言的各种特性。此前,我们学习了友元机制的基本概念和作用,今天,我们将进一步深入探讨友元机制中的一些复杂情况,包括友元函数的声明顺序、传递对象地址与不完全类型说明的关系,以及嵌套友元的概念和使用规则。理解这些知识将有助于我们在更复杂的编程场景中正确运用友元机制,同时也能更好地理解C++语言在访问控制和数据封装方面的设计理念。 阅读详情


概念: 通常让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限

需求:在为类重载二元(两个参数)运算符时,需要用到友元

重载运算符(作为成员函数还是非成员函数):对于很多运算符来说,可以使用成员函数和非成员函数重载,一般来说,非成员函数应该是友元,这样它才能访问类的私有数据


.hpp

#ifndef FriendCode_hpp
#define FriendCode_hpp

#include <stdio.h>
#include <iostream>
using namespace std;


class Time {
    
    
public:
    
    double p_d;
    
    //成员函数重载
    Time operator*(double d);
    
    
    //友元函数
    friend Time operator*(double d , Time &t);
    friend ostream & operator<<(ostream &os ,const Time &t);
};


#endif /* FriendCode_hpp */



.cpp

#include "FriendCode.hpp"

//普通运算符重载
Time Time::operator*(double d)
{
    this->p_d *= d;
    
    return *this;
}


//友元函数重载operator*,不需要声明类 Time::operator*()
Time operator*(double d , Time &t)
{
    Time T;
    T.p_d *= t.p_d;
    
    return T;
}

//友元函数重载operator<<,不需要声明类 Time::operator*()
ostream & operator<<(ostream &os ,const Time &t)
{
    os << t.p_d << "重载<<" << endl;;
    
    return os;
}


main

#include "FriendCode.hpp"


int main(int argc, const char * argv[]) {
    
    //友元函数 double * Time.double
    Time t;
    Time b{10};
    t = 3*b;
    
    
    //成员函数 Time.double * double
    Time k;
    k = b.operator*(10);
    k = k*10;
    
    
    //输出<<
    cout << b;
    
    
    return 0;
}



c++ primer 第十九章习题 练习19.21-25 #ifndef TOKEN_H #define TOKEN_H #include&amp;lt;iostream&amp;gt; #include&amp;lt;string&amp;gt; #include &quot;Sales_data.h&quot; using std::string; class Token { friend std::ostream &amp;amp;operator& 阅读详情

相关推荐

咱们一起学C++ 第一百九十九篇:之C++中那些不会自动继承的函数

大家好!C++的继承机制虽然强大,但其中有些函数并不会自动从基类继承到派生类中。今天咱们就来深入了解一下这些特殊的函数,通过实际的代码示例,一起把这个知识点吃透,在C++学习的道路上共同进步!

wj_rdk的博客 1138

C++学习记录3——友元与运算符重载

C++学习记录3——一、友元1.全局函数做友元2.类做友元3.成员函数做友元 一、友元 程序中的一些私有属性,也想让类外的一些特殊的函数或类进行访问,友元的目的就是让函数或类访问另一个类内的私有成员。 关键字friend 友元的三种实现: 1.全局函数做友元 class Building { //写在类的前端 friend void godgay(Building* building); public: Building() { m_sittingroom = "客厅"; m_bedroom

weixin_61015911的博客 1096

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2118

《 C++ 点滴漫谈: 十九 》揭秘 C++ 的 “朋友圈”:友元关键字 friend 权衡封装与灵活性的利器

在 C++ 中,friend 关键字是一个特殊的工具,它允许特定函数或类访问目标类的私有和保护成员,从而为类之间的协作提供了极大的灵活性。然而,这种突破封装性的机制也伴随着潜在的风险,如代码耦合度增加和可维护性下降。本文从 friend 的基本概念入手,详细探讨其典型用途、优缺点、常见误区以及在设计模式中的实际应用。同时,结合现代 C++ 特性,对 friend 的性能影响和注意事项进行了深入分析,并提供了实际应用场景和学习建议。通过本文,你将全面掌握 friend 的使用方法与最佳实践,为优化代码设计和提

Lenyiin 2790

Docker部署FRP实现内网穿透

FRP是一款开源内网穿透工具,通过在公网服务器部署服务端(FRPS),内网设备运行客户端(FRPC)实现外部访问。支持TCP、UDP、HTTP等多种协议。部署时需配置服务端(如群晖NAS使用Docker)和客户端(如Windows下载可执行文件)。服务端需设置监听端口、控制面板及Token认证,客户端需指定服务器地址和相同Token。完成配置后可通过公网IP或域名访问内网资源,并在控制面板监控连接状态。

波哥技术栈 1599

不写代码,Cursor 10分钟开发1个APP!保姆级教程喂饭来了

做出第一个能运行的app,那种成就感真的很棒。虽然过程可能有点折腾,但只要耐心一点,问题都能解决。记住,遇到问题不要慌,现在有AI帮忙,大部分问题都能快速解决。重要的是迈出第一步,开始动手实践。你的第一个app可能很简单,但这是一个很好的开始。随着经验积累,你能做出的东西会越来越酷。现在就开始行动吧,说不定下个月你就能向朋友炫耀你自己做的app了!

chenhong007的博客 1548

如何Dev-Cpp 环境下进行C++开发的介绍

document.title="在Dev-Cpp 环境下进行开发的介绍 - "+document.title;Dev-Cpp 环境下进行开发本文主要是收藏“北斗星君的专栏”中Dev-Cpp/Mingw32/GCC专栏的文章链接,这是介绍有关于在Dev-C++/Dev-Cpp环境下进行C++开发的文档:初级篇介绍这一部分主要是介绍怎样操作IDE,安装组件等内容。第一章

roger007的专栏 6437

【一键搞定】ThinkPHP6.0.2+PHPStudy+Composer极速安装指南——附完整下载包与避坑技巧

本文提供了一份ThinkPHP6.0.2的完整下载包,并详细介绍了如何配合PHPStudy和Composer进行极速安装与配置。指南涵盖了环境准备、Composer国内镜像加速、项目部署及常见避坑技巧,旨在帮助开发者,尤其是内网或网络不佳的用户,快速搭建可运行的TP6开发环境,绕过依赖下载的繁琐步骤。

assembly8low的博客 1006

【Cpp】第十九章-Cpp11新特性

Cpp11新特性   Cpp11中新增了很多新的语法,很多之前我们都已经有介绍过 初始化列表 如何使用   在Cpp11中允许使用初始化列表初始化任何类型,不论是内置类型还是自定义类型都可以使用初始化列表进行初始化,而在Cpp98的版本中是不能初始化自定义类型的。 #include <iostream> #include <vector> class Test { publ...

qq_41669298的博客 980

第十篇|网络子系统 ②——无损以太网、PFC/ECN、DCQCN 与拥塞可视化

网络部分了解了解

qq_37535542的博客 1874

13、数据来源介绍与操作指南

本文详细介绍了多种数据源的特点、操作步骤及适用场景,包括元数据数据源、MongoDB数据源、Pentaho Data Integration数据源、OLAP数据源、Pentaho分析数据源和OLAP4J数据源。通过流程图和表格对比,帮助用户理解不同数据源的选择与使用方法,并提供了实际应用案例和注意事项,旨在提升数据获取与分析效率,支持高效报告生成。

ik678901234的博客 148

c/c++基础(十九) 友元

概念的东西不讲了,直接上代码: 1.友元函数: Point.类的声明与定义: #pragma once #ifndef _POINT_H #define _POINT_H class Point { public: void getXY(); friend double distanceXY(Point &a,Point &b); public: Point(double

if(...){...} 907

DeepSeek赋能公文写作:从高效成文到精准传情的全维度指南

摘要:AI赋能公文写作的精准化实践 公文写作长期面临框架混乱、素材匮乏、表达不规范、修改低效等痛点。DeepSeek等AI工具通过"精准指令+分步赋能"模式实现突破:首先明确公文的目的性、逻辑性和规范性特征;其次采用包含场景、类型、目的等要素的指令模板;再分四步实施:框架搭建确保层次分明,内容填充解决素材问题,表达优化适配不同语体,合规校验把关格式规范。典型案例显示,AI能将数据罗列转化为"数据+成果+价值"的生动表述,使公文既规范又具感染力。这种AI赋能的写作方法显

通俗易懂学IT 231

C++从入门到实战(十九)C++ vector容器及其常用接口

本文介绍了C++ STL中的vector容器及其常用接口。vector是动态数组容器,可自动扩容存储任意类型数据。文章详细讲解了vector的多种构造方式(默认构造、指定大小、迭代器范围构造等),以及遍历方法(下标访问、at()安全访问、迭代器和范围for循环)。通过对比表格和代码示例,帮助读者掌握vector的核心功能和使用场景,为后续学习复杂容器打下基础。全文结合官方文档和实际应用,提供了清晰直观的语法说明和示例输出。

2402_83322742的博客 1682

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2159

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

第十九周自由练习项目——acm 输出日期时间类——友元类

/* *程序的版权和版本声明部分: *Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称:acm 输出时间日期——友元类 *作者:刘中林 *完成日期:2014年6月3日 *版本号:v0.1 *对任务及求解方法的描述部分: *输入描述: *问题描述: *程序输入: *程序输出: *问题分析: *算法设计: *我的程序: */ #inclu

u012369385的专栏 917

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【送书福利-第十九期】《C++ Core Guidelines解析》

【程序员洲洲送书福利-第十九期】《C++ Core Guidelines解析》

努力才是唯一的入场券。 4万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c++tutorial(十九):友元和继承

朋友的功能 原则上,不能从声明它们的同一个类之外访问类的私有成员和受保护成员。但是,此规则不适用于“朋友”。 Friends是使用friend关键字声明的函数或类。 友元函数 如果一个非成员函数被声明为该类的朋友,则它可以访问该类的私有成员和受保护成员。这是通过在类中包含此外部函数的声明,并在其前面加上关键字来完成的friend: // friend functions #include &lt;...

IQIT 653

conan入门(十九):封装第三方开源库cpp_redis示例

conan: 封装第三方开源库cpp_redis示例 在我的之前关于conan系列博客中,已经介绍过如何引用Conan中央仓库(conan-center)预定义的第三库(《conan入门(五):conan 交叉编译引用第三方库示例》),以及如何将自己的项目封装为Conan包以供第三方引用(《conan入门(七):将自己的项目生成conan包》)。 但是这个世界实际是复杂的,虽然Conan中央仓库已经收录了上千个常用的开源第三方库,但仍然有更多的第三库并没被Conan中央仓库收录,你不能指望你所需要的任何第三

10km的专栏 3139

C++ 引用(Reference)详解(十九)

在 C++ 中,**引用(Reference)** 是一种非常常用的复合类型。它常被描述为“某个对象的别名”,在语法和语义层面与指针有着相似又截然不同的特性。本文将详细介绍 **引用** 的定义、初始化方式、使用场景,以及与对象之间的关联关系。

hello.reader 1334

C++语言学习(十九)——C++类型识别

C++语言学习(十九)——C++类型识别 一、C++类型识别简介 1、C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型。RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持。为了支持RTTI,C++提供了一个typ...

weixin_33910137的博客 729

《 C++ 点滴漫谈: 三十九 》不泄露的秘密:用 RAII 打造稳健的 C++ 程序

本篇博客深入解析了 C++ 中的 RAII(资源获取即初始化)机制,从基础原理到现代语法融合,全面剖析其在资源管理、异常安全和工程实践中的重要价值。文章不仅涵盖智能指针、锁管理、文件封装等典型应用场景,还探讨了 RAII 与 C++20 协程、事务控制等前沿技术的结合。同时指出常见误区与调试技巧,帮助开发者构建更加健壮、安全、易维护的 C++ 应用程序。

Lenyiin 3365

Hello C++(十九)——C++类型识别

一、C++类型识别简介 1、C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改。 C++语言中,静态类型是对象自身的类型,动态类型是指针(引用)所指向对象的实际类型。 RTTI(Run-Time Type Information)即运行时类型识别,C++通过RTTI实现对多态的支持。 为了支持RTTI,C++提供了一个type_info类和typeid与dynamic_cast两个关键字。 2、type_info结构体 type_info :   存储特点类

天山老妖 3153

C++学习笔记(十九)

C++的第十九篇博客,用C++实现职工管理系统,本文是下半部分。

m0_71007572的博客 712

C++学习 十九、类型转换符

C++学习 十九、类型转换符前言static_castdynamic_castconst_castreinterpret_cast 前言 本篇学习C++中的四个类型转换符号,static_cast,dynamic_cast,const_cast,reinterpret_cast。 C++使用以上这四种转换代替C风格的强制类型转换。 static_cast static_cast用于低风险的转换,例如: 自动类型转换,如int转double 向上转换,如派生类指针转基类指针 向下转换,如基类指针转派生类指针

qq_41035283的博客 920

C++ Exercises(十九)

1.写一个函数,将字符串中的/t 都转换成4 个空格。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include iostream>#include string>using namespace std;string 

1023
上一篇: Xcode 8带来的新特性和坑
下一篇: C++ 动态内存分配(二十)
Gz_Jason_chen
博客等级 码龄11年 49粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值