C++基础#10:友元的使用方法,友元函数和友元类,friend

C++ 知识补充 向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。 阅读详情

友元函数和友元类:
   采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。
   但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。
   除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率,但又破坏了类的封装性,因为友元使得非成员函数可以访问类的私有成员。
   从这一点来也可以看出,C++并不是纯的面向对象的语言,毕竟,C++语言的设计是为了实用,而不是追求理想的抽象。
  
一. 友元函数
1. 概念:

   友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,
   其格式如下:
     friend 类型 函数名(形式参数);
   形式参数必须是类对象的引用。

2. 说明:
   (1) 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
   (2) 一个函数可以是多个类的友元函数,不过需要在各个类中分别声明。
   (3) 友元不是成员函数,但是它可以访问类中的私有成员。
   (4) 友元函数常常是另一个类的一个成员函数,这样通过友元函数就可以使一个类对象直接访问另一个对象的私有成员。
         再次强调,友元破坏了类的封装性
   (5) 当友元函数是另一个类的成员函数时,应当注意以下几点:
         A:友元函数作为一个类(如Boy)的成员函数时,除应当在它所在的类定义中声明之外,还应当在另一个类(如Girl)中声明它的友元关系,声明语句的格式为:
            friend 函数类型 函数所在类名::函数名(参数列表);
           
         B:友元函数(如disp)在引用本类对象(如b)的私有成员(如name,age)时无需本类对象的引用参数,但在引用声明它是友元的类(如Girl)的对象(如g)中的
         私有成员(如name,age)时, 必须有友元类对象的引用参数。
        
         C:一个类(如Boy)的成员函数作另一个类(如Girl)的友元函数时,必须先定义,而不是仅仅声明它。3. 举例:
(1)外部函数作为友无函数:

/* 例1:friend_person.cpp */
    /* IDE环境: Dev-C++ 4.9.9.2 */
    /* 外部函数作为友无函数 */

    #include "stdio.h"
    #include "string.h"
    #define NAME_MAXLENGTH 20
   
    class Person
    {
        public:
               Person()
               {
                   memcpy(name," NO Name",NAME_MAXLENGTH);
                   age = 0;
                   sex = 'W';
               }
               Person(char* n, int a, char s)
               {
                   memcpy(name,n,NAME_MAXLENGTH);
                   age = a;
                   sex = s;
               }
               friend void disp(Person&); // 声明友元函数
   
               char* getName()
               {
                   return name;
               }
               ~Person()
               {
                   printf("destory:  %s/n", this->getName()); 
               }
    
   
        private:
           char name[NAME_MAXLENGTH];
           int age;
           char sex; // 'M': men;  'W': women
    };
   
    void disp(Person &x)  // 定义外部友元函数,不是定义成员函数。
    {
        printf("name: %20s,    ", x.name);
        printf("age:  %4d,    ", x.age);
        printf("sex:  %2c    ", x.sex);
        printf("/n");
    }
   
    void testFunction()
    {
   
        Person Wang("Wang",20,'M');  
   
        disp(Wang);  // 调用友元函数
   
    }
   
    int main()
    {
        testFunction();
       
        while(1);
        return 0;
    }

运行结果:

/* result:
          name:                wang,    age:  20,    sex:  M
          destory:  wang
*/
   

(2)另一个类的一个成员函数作为友无函数:

/* 例2:friend_Girl_Boy.cpp */
    /* IDE环境: Dev-C++ 4.9.9.2 */
    /* 另一个类的一个成员函数作为友无函数 */
   
    #include <stdio.h>
    #include <string.h>
    class Girl;   //向前引用, 声明类名Girl
   
    class Boy{
          private:
              char *name;
              int age;
          public:
              Boy(char *N,int A)
              {
                  name=new char[strlen(N)+1];
                  strcpy(name,N);
                  age=A;
              }
              void disp(Girl &); //声明disp()为类boy的成员函数
              ~Boy(){delete name;}
    };
   
    class Girl{
          private:
              char *name;
              int age;
          public:
              Girl(char *N,int A)
              {
                  name=new char[strlen(N)+1];
                  strcpy(name,N);
                  age=A;
              }
              friend void Boy::disp(Girl &); //声明类Boy的成员函数disp()为类Girl的友元函数
              ~Girl(){delete name;}
    };
   
    void Boy::disp(Girl &x) // 定义成员友元函数
    {
        printf("Boy/'s name is: %s, age is: %d /n", name, age); //访问本类对象成员
        printf("Girl/'s name is: %s, age is: %d /n", x.name, x.age); //访问友元类对象成员
    }
   
    int main()
    {
        Boy b("chen hao",25);
        Girl g("zhang wei",18);
       
        b.disp(g);
       
        while(1);
        return 0;
    }

   运行结果:

/* result:
              Boy's name is: chen hao, age is: 25
              Girl's name is: zhang wei, age is: 18
    */


   
二. 友元类
1. 定义友元类:   

    也可以把一个类而不仅仅是一个函数声明为另一个类的友元类。这时,只需先声明它而不一定需要先定义。
    定义友元类的语句格式如下:
         friend class 类名;
   其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
   例如,以下语句说明类B是类A的友元类:
   class A
   {
       …
       public:
           friend class B;
       …
   };
  经过以上说明后,类B的所有成员函数都是类A的友元函数,且能存取类A的私有成员和保护成员。


2. 友元类注意事项:
   (1) 友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元,类Y是否是类X的友元也要看类X中是否有相应的声明。即友元关系不具有交换性。
   (2) 若类X是类Y的友元,类Y是类Z的友元,也不一定就说明类X是类Z的友元,即友元关系也不具有传递性。
3. 举例:

/* 例3:friend_class.cpp */
    /* IDE环境: Dev-C++ 4.9.9.2 */
    /* 友元类 */
   
    #include <stdio.h>
    #include <string.h>
   
    class Girl;   //向前引用, 声明类名Girl
   
    class Boy{
          private:
              char *name;
              int age;
          public:
              Boy(char *N,int A)
              {
                  name=new char[strlen(N)+1];
                  strcpy(name,N);
                  age=A;
              }
              void disp(Girl &); //声明disp()为类boy的成员函数
              ~Boy(){delete name;}
    };
   
    class Girl{
          private:
              char *name;
              int age;
              friend class Boy;   //声明类boy是类Girl的友元, 在VC6.0中,可以省略"class",
                                  //但是,在Dev-C++ 4.9.9.2中,"class"是不可以省略的。
                                
          public:
              Girl(char *N,int A)
              {
                  name=new char[strlen(N)+1];
                  strcpy(name,N);
                  age=A;
              }
              //friend void Boy::disp(Girl &); //声明类Boy的成员函数disp()为类girl的友元函数
              ~Girl(){delete name;}
    };
   
    void Boy::disp(Girl &x) // 定义函数disp()为类Boy的成员函数,也是类Girl的友元函数
    {
        printf("Boy/'s name is: %s, age is: %d /n", name, age); //访问本类对象成员
        printf("Girl/'s name is: %s, age is: %d /n", x.name, x.age); //访问友元类对象成员
    }
   
    int main()
    {
        Boy b("chen hao",25);
        Girl g("zhang wei",18);
       
        b.disp(g);
       
        while(1);
        return 0;
    }

   运行结果:

/* result:
              Boy's name is: chen hao, age is: 25
              Girl's name is: zhang wei, age is: 18
    */
   
   


朋友的朋友是朋友。 

C++之友元(Friend)用法总结 目录 一.引言 二.友元(Friend)与类之间的关系  2.1 同类间无私处  2.2异类间有友元  2.3友元不是成员 三.友元函数(Friend fucntion) 3.1全局函数做友元 3.2成员函数做友元 3.3类做友元(Friend class) 四.总结 4.1声明位置 4.2友元利弊 4.3注意事项 一.引言 最常见的获取数据成员的方式就是Set方法和... 阅读详情

相关推荐

C++ 友元(Friend)详解

在 C++ 中,一个类可以将另一个类的成员函数或者全局函数声明为友元(friend)。这样,友元函数可以直接访问该类的私有成员和保护成员,就像该类的成员函数一样。💡友元并不是继承关系,它只是授予其他函数或类一定程度的权限。简单来说,友元就像是“特权成员”,能够访问一个类的私有部分,拥有“超能力”!😎友元函数是在类内部声明的外部函数。它可以访问该类的私有和保护成员。通常我们会把友元函数声明为friend,并且它通常是全局函数或其他类的成员函数。private:public:// 声明友元函数。

m0_62599305的博客 1287

C++友元详解

友元介绍

m0_73803550的博客 8081

C++中的friend友元函数详细解析

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体

C++友元(friend)解释

目录一.友元函数先看普通函数声明为友元函数:再看类成员函数声明为友元函数:最后说明二.友元类三.完整示例:四.同一个类(class)的类对象(object)互为友元 友元是什么,说白了一句话,就是为了不受类的封装性的约束 ,好让我们可以访问类私有数据成员。语法上使用friend关键字。 一.友元函数 友元函数可以是普通函数或者类成员函数。 先看普通函数声明为友元函数: 如下所示: #include <iostream> #include <cmath> using namespac

weixin_43744293的博客 6402

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 263

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3934

C++总结 友元类和友元函数

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,

729

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1965

友元(friend)

友元:friend

Pop_Rain的博客 464

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9690

Windows 10/11下R与RStudio最新版安装避坑指南(含镜像加速配置)

本文提供了Windows 10/11系统下R与RStudio最新版的详细安装指南,包含镜像加速配置和常见问题解决方案。通过分步教程帮助用户避开安装陷阱,优化开发环境设置,特别适合国内用户快速搭建高效的数据分析平台。

weixin_29065959的博客 1005

友元、运算符重载、类型转化

友元函数、运算符重载、类型转化

lfnlook的博客 390

深度学习笔记——Transformer

本文详细介绍面试过程中可能遇到的Transformer知识点。

haopinglianlian的博客 1703

c++重载运算符_C++运算符重载

运算符重载友元友元函数友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。关键字friendfriend 友元类友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)//类前面加上friend声明友元类 注意事项:只有友元可以访问,其他...

weixin_39892447的博客 195

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

芒果YOLOv12改进13:独家原创改进最新 CFNet 核心结构|即插即用 | 首发改进显著提升检测性能,小目标检测涨点必备

包括YOLOv5、YOLOv7、YOLOv8等模型改进 286

【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中)

你是否在全网苦寻【图像去噪(ImageDenoising)】的相关资料?你的目标是否是看懂【图像去噪(ImageDenoising)】的相关论文,复现代码,跑出结果,并试图创新?你是否需要发表【图像去噪(ImageDenoising)】的相关论文毕业?你是否需要做【图像去噪(ImageDenoising)】的相关项目,开发软件,研究算法,获得专利或者软著?只要是与【图像去噪(ImageDenoising)】有关的问题,那么请继续往下看。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

C++运算符重载与友元机制:从原理到实践打造直观自定义类型

在C++面向对象编程中,运算符重载允许开发者为自定义类型定义与内置类型一致的操作符行为,这是实现抽象数据类型和提升代码可读性的核心技术。其原理在于通过成员函数或全局函数重新定义操作符的语义,编译器根据操作数类型选择匹配的重载版本。这项技术的核心价值在于让用户自定义的类(如复数、矩阵、字符串)能够使用直观的算术、比较和流操作符,从而编写出更自然、更易于维护的代码,广泛应用于数学库、容器类和资源管理类的设计中。为了实现某些特定操作符(如流插入`<<`)的对称性或访问多个类的私有成员,需要引入友元机制。友元函数或

weixin_34293246的博客 410

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[八股文3]C++之友元函数

本文通过生活化比喻和趣味案例介绍了C++中的友元函数和友元类概念。友元机制允许特定外部函数或类访问类的私有成员,就像密友可以进入私人空间一样。文章首先用蓝牙耳机案例演示友元函数如何访问私有密码实现模式切换功能,随后通过三国典故中曹操强占张绣婶娘的代码示例,生动展示友元类的权限越界问题,将编程概念与历史典故巧妙结合,既解释了技术要点又增添了趣味性。

2403_89572017的博客 377

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

类和对象3

类和对象

cJH13的博客 216

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++个人笔记

C++笔记

qq_54046894的博客 799

C++笔记

C++基础知识速查指南,涵盖编译流程、变量作用域、输入输出操作、数组和动态数组(vector)使用、枚举和类型别名、命名空间、指针和引用、静态变量、函数定义与重载、面向对象编程(类/结构体/继承/多态)、虚函数和纯虚函数等核心概念,并提供了智能指针、函数指针、内联函数等进阶用法示例,适合快速回顾C++关键语法特性。

lanshanghu的博客 265

16- C++多态-4 (C++)

1、运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载不能改变本来寓意,不能改变基础类型寓意)2、运算符重载(operator overloading)只是一种语法上的方便,也就是它只是另一种函数调用的方式。3、在c++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator及其紧跟的运算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。4、可以重载的运算符。

March_A的博客 746

C++的基础知识点

并锁住后续输入(不读取),需要手动清除错误才能恢复。// 等价于 typedef int INT;:函数名相同,参数列表不同(参数类型、个数、顺序不同),与返回值无关。:命名空间不占内存,只针对编译器起作用,限制编译器对其中符号的访问。在全局作用域引入整个命名空间,容易引起命名冲突。:把运算符当成函数处理,可以自定义运算符的行为。有一个输入缓冲区,默认按空格或换行分割输入。:空间内部的变量互不影响,避免命名冲突。:C++ 中的结构体可以包含函数。访问命名空间中的单个元素)。:只在当前文件中生效,相当于。

2401_87196189的博客 89

C++ friend详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。 C++ 是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。 C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的...

fkuner的博客 9010

【C++ | 友元(friend)】友元函数、友元类、友元成员函数详解及例子代码

本文介绍了C++的友元函数、友元类、友元成员函数、其他友元关系,以及使用例子介绍了如何声明、定义、使用。

wkd_007的博客 1万+
上一篇: C++基础#16:Java抽象类和C++虚基类的异同
下一篇: C++基础#11:C++经典书籍
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值