C++友元

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

友元

友元函数

但是

友元类

这里的意思是Date是Time的友元,那么就能在Date里访问Time,但是Time并不能访问Date

这种友元关系是单向的,我是你的友元,你不一定是我的友元

内部类

就是在一个类的里面再定义一个类

这里的类B是类A的一个内部类,还可以看出A的大小只有4

就能发现,类B跟类A在空间独立的,只是受A的类域限制

另外,如果内部类是共有的就可以直接使用,若是私有的就不能使用了,说明内部类也受访问限定符的限制

内部类天生是外部类的友元

编译器的一些优化

这就是一部分优化

若是使用引用传参,则都不会进行优化

至于为什么要加const是因为当传第二个参数2时,会先产生一个临时对象,这个临时对象具有常性,所以使用引用传参时才需要加上const

还有这些优化

同一个程序,写法不同优化程度也就不同

总结:

1、接受返回值时尽量拷贝构造接收,不要赋值接收

2、函数中返回对象时,尽量返回匿名对象

C++ Friend 友元机制 友元函数(Friend Function)是一种定义在类外部的普通函数,但通过在类定义中用friend关键字声明,使其能够访问该类的所有成员,包括私有和保护成员。友元函数不是类的成员函数,在调用时不需要通过对象实例。// 私有成员public:// 声明普通函数 FriendFunc 为友元函数// 友元函数的定义(注意它不是类的成员函数)// 可以直接访问 MyClass 的私有成员友元类(Friend Class)是指一个类将另一个类声明为自己的友元。 阅读详情

相关推荐

zabbix添加IBM服务器SNMPV3监控

本地采用欧冠的是zabbix5.0,服务器型号是SR860,使用snmpv3因为只支持这个,醉了。说明:本地采用欧冠的是zabbix5.0,服务器型号是SR860。

萌新包大人的博客 1984

C++ 友元类

1.在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 2.友元类 : 友元类的所有成员函数都是另一个类的友

weixin_43107240的博客 4万+

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 454

C++中的友元

C++中的友元友元的概念引入友元的分类类的非成员函数友元类的成员函数友元类友元友元的特点友元说明 友元的概念引入 C++的最重要的特点之一就是封装性和继承性。对于类的封装性来说,就是类的私有成员和保护成员只能在设计类时它所定义的函数内使用,即私有成员和保护成员只能通过该类的成员函数来访问。 当我们需要在类的外部访问该类的私有成员和保护成员时,就可以利用友元(**friend**)来实现这一操作。 友元的分类 类的非成员函数友元 类的非成员函数友元: 表示友元函数不是当前类的成员函数,而是独立于当前类

qq_44423388的博客 550

高项49个过程,输入、工具技术、输出的思维导图

为了制定项目章程的管理方法主要是采用了数据收集技术,例如通过头脑风暴,通过召集主题专家和团队成员收集信息、解决方案,并在短时间内获得大量创意,并对大量创意进行分析和排序,选出最优化最适合本项目方案,并对项目成员的不同差异观点,进行了引导和对冲突的管理,最终有助于项目干系人的目标、成功标准的内容达成一致意见,形成完善的项目章程。在本过程中得到项目章程,在制定项目章程中需要包括信息有:项目名称、项目目标、项目总里程碑进度表、项目经理、主要干系人及财务预算信息。本过程在仅开展一次,或仅在项目的预定义点开展。

Legend_Jiang的博客 6179

自动驾驶仿真(六)—— SIL软件在环仿真测试

自动驾驶仿真六—— SIL软件在环仿真测试1. 在环仿真测试2. SIL软件在环仿真测试2.1 模型配置参数2.2 S function生成实现2.3 结果对比3. 参考学习的书目教材 博主前面的博文已经简要介绍了Carsim、Prescan 与 Simulink 在 “V”型开发流程的一些应用,现今成熟的汽车控制系统软件都是以(Model Based Design,MBD)来开发,它以图形化的方式表达复杂的逻辑、代码可读性、可移植性、开发调试便利程度都大大增强,同时利用成熟的代码生成工具链,也避免了手工代

zhudj08的博客 8650

C++ 友元

C++ 友元1. 何为友元2. 同类对象之间无隐私3.异类对象之间有友元3.1 友元函数3.1.1 全局函数作友元函数3.1.2 类成员函数作友元函数3.2 友元类4. 小结4.1 声明位置4.2 友元利弊4.3 注意事项 1. 何为友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数。除了友元函数外,还有友

qq_43414070的博客 1590

华为OD机试 - 敌情监控 - 滑动窗口(Java 双机位C卷 200分)

说明 第一行第一个正整数5,表示敌人有5个营地,第二个正整数2,表示连续营地 的数量是2, 第3个正整数3, 表示后续会有3条查询的命令;接下来一行有 5个正整数,分别表示每个营地里开始的人的数,第1个营地开始有1个人,第 2个营地开始有2个人,第3个营地开始有2个人,第4个营地开始有3个人,第 5 个营地开始有3个人;第3条命令:Query 2 4 表示查询第2到第4个营地的总人数,结果:2+8=10 第一个输出是: 10,注意这里第3个营地人数在第2条命令中增加了6。第一行3个正整数:N K L。

学Java,找哪吒 764

C++友元详解

友元介绍

m0_73803550的博客 8081

YOLOv11 结合 BiFormer 注意力:打造多场景高精度检测模型实战教程

注册BiFormer模块(若代码未自动注册)# 加载自定义配置的YOLOv11模型。

know_F0727的博客 251

ArcGIS Pro 3.4 二次开发 - 布局

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作布局工程项的相关方法。主要内容包括:引用布局工程项和关联布局,在新视图中打开或激活已有布局视图,引用活动布局视图,导入/移除布局工程项,创建基本布局或带参考线的自定义布局,修改布局页面尺寸,以及创建圆形图形元素等操作。重点演示了如何通过CIM(Core Infrastructure Model)进行高级布局配置,并详细说明了圆形图形元素的创建过程,包括几何构建、符号设置和图形生成。所有涉及UI线程的操作都遵循ArcGIS Pro SDK

Winemonk 795

C++ 友元机制

在 C++ 编程世界中,友元机制是一项独特且强大的功能,它赋予了特定函数或类访问其他类私有成员的权限,突破了常规的访问限制。使用不当,则会给代码带来一系列隐患。例如,在实现游戏引擎的 3D 渲染时,允许 Matrix 类直接访问 Vector 的私有数据(数学计算优化)属于合理使用;日常开发应优先使用常规工具(公共接口),只有遇到必须突破封装的情况时才谨慎使用友元,并做好安全防护。要记住,每增加一个友元,就是给系统增加一个潜在入口,必须如履薄冰地管理。通用的业务系统,追求稳定性和通用性,如公共图书馆系统。

2401_84228999的博客 1857

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 64

C++ 友元

友元友元 英文 friend。friend 翻译成中文就是朋友,翻译成术语就是:友元。朋友就很好理解了,我的钱你随便花,我的东西你随便用;当然我也是你的朋友,你的钱我随便花,你的东西我随便用。当然在 C++ 里,类与类 之间可以作为友元,那么这个类就可以去操作另外一个类里面私有的成员;函数与函数 之间也可以作为 友元,所以友元分为: 友元函数 和 友元类。我们通过一个例子一看就明白了:写代码#inc

AoboSir.com 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

10 C++ 友元

C++友元机制摘要 友元(friend)允许外部函数或类访问当前类的私有和保护成员,主要分为友元函数、友元类和友元成员函数三种类型。关键特性包括: 单向非传递:友元关系不可逆且不传递 灵活声明:可在类任意位置声明,不受访问控制符限制 典型应用:运算符重载(如<<)、跨类数据共享、单元测试 优势在于提供高效访问和自然语法,但会破坏封装性。建议优先使用成员函数,仅在必要场景(如流操作符重载)使用友元,并严格限制友元范围。 示例场景:设备控制器(友元类)访问设备温度数据(私有成员)

17208955的博客 1680

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++友元类

友元类 不仅可以将一个函数声明为一个类的“朋友”,还可以将一个类(例如 B类)声明为另一个类(例如 A类)的“朋友”。这时B类就是A类的友元类。友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。 声明友元类的一般形式为: friend class 类名; 所以,可以在A类的定义体中,可以使用如下语句声明B类为其友元类: friend class B; 那么,类B是类A的友元类。所以,类B的成员函数就可以访问类A的私有成员。 ...

LC的专栏 7397

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++ 中的友元

关于友元关系:在C++中,友元(Friend)功能是一个相对特殊的概念,允许某些特定的函数或其他类访问当前类的私有(private)或受保护(protected)成员。友元功能是C++中用于特定情况下实现类之间数据访问的机制。优点:打破类的封装,广泛应用于操作符重载缺点:破坏了类的封装,类之间互相依赖,代码高度耦合,头文件,类声明,粉墨登场,没有固定设计模式,难以设计友元的4种主要类型:1 友元函数:友元函数可以是任何普通函数。它被允许访问某个类的所有成员(包括私有和受保护)。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 500

c++类——友元

如有兴趣了解更多请关注我的个人博客。

xiaohei07的博客 2138
上一篇: const修饰的成员,静态成员和匿名对象
下一篇: C++内存管理
宴之敖者、
博客等级 码龄4年 131粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值