C++的多态

Halcon形状模板匹配实战:inspect_shape_model参数优化指南 本文深入解析Halcon形状模板匹配中inspect_shape_model参数的优化技巧,涵盖NumLevels和Contrast参数的实战应用。通过具体案例展示如何平衡匹配速度与精度,帮助开发者高效调试形状模型,提升工业视觉检测的准确性和效率。 阅读详情

虽然没有学过Java,但是很喜欢Java的干净、统一,没有特别多的意外情况。因为Java里“一切皆是对象”。所有的类型都继承自Object类型,所以能写出一个适用于一切类型的函数。这是一个良好的实践,符合设计模式的基本特征。

所以当我们看许多C++框架的时候,这个框架都会有一个Object类,框架里所有的类都继承自这个类——这也算是自成一个小系统了。

但是,在写C++程序时,我时常会遇到一个问题——并不是一切皆是Object。当我们费尽心思写出一个能够处理所有类型的函数时,譬如:

template<class T> void f(T t)
{
第一步,调用t的构造函数
第二步,XXXX
}

我们发现,写函数的时候,都会对参数有某些假设,譬如,所有的参数都可以加减乘除,所有的参数都可以调用构造函数。没错,如果所有的类型都由我们自己来定义,确实没问题。但是——C++有自己的原生类型,C++的POD(Plain Old Data),也就是标量类型或传统类型。

当我们写出一个函数时,世界一片和谐一片大好。但是,突然发现,有那么一点不和谐。有一点东西就是纳入不到我们的框架之内,这时候我们需要单独地、特别地来处理这些不和谐的因素。

上述所说的“一切皆对象”是所有面向对象编程语言都提供的东西。通过继承来实现运行时多态。但是C++提供了函数重载和模板偏特化这两种工具来实现编译时多态。相比于运行时多态,编译器多态比较麻烦,但是随度更快。

1. 函数重载

如果同一作用域内的几个函数名字相同但形参列表不同,我们称为重载函数(overloaded)。
而掌握函数重载的关键是掌握函数匹配的原则。

1.1 函数匹配

  1. 第一步是选定本次调用对应的重载函数集,也就是候选函数。候选函数有两个要求:一是与被调用函数同名;二是其声明在调用点可见。
  2. 根据实参,从候选函数中选择可行函数。可行函数有两个特征:一是形参数量与本次调用提供的实参数量相等;二是每个实参的类型与对应形参类型相同,或者是能转换成形参的类型。
  3. 寻找最佳匹配,其基本思想是:实参类型与形参类型越接近,匹配得越好。而这就是函数重载发挥作用的地方。
  4. 如果找不到唯一的最佳匹配,则产生二义性编译错误。

而函数重载的难点在于,实参类型可以转换成形参类型时,如何确定最佳匹配。

1.2 C++中的类型转换

  • 由const引起的类型转换。
    • 对于顶层const来说,譬如const int,与int类型编译器同等对待,两者等价;
    • 对于底层const来说,其实主要指的是指向常量的指针和对常量的引用,允许指向非常量指针/对非常量的引用转换为指向常量的指针/对常量的引用。
  • 由于继承引起的类型转换。
  • 算术转换,也就是算术类型之间的转换。
    • 整型提升。把小整数类型转换为较大的整数类型。
    • 其他算术类型转换。
  • 数组与指针的等价性
  • C++规定的指针转换方式:nullptr可以转为任意指针类型;而任意指针可以转为const void*,任意指向非常量的指针可以转为void*。
  • 类类型转换。这是由重载类型转换运算符来完成的。编译器每次只能执行一次。可以置于上述标准的类型转换之前和之后。

1.3 函数匹配的最佳匹配等级

  1. 精确匹配:分情况:
    • 实参类型与形参类型相同;
    • 实参从数组类型或函数类型转换成指针类型
    • 实参添加/删除顶层const。
  2. 通过const转换实现的匹配;
  3. 通过类型提升实现的匹配(有int型形参,有short形参,则char直接提升为int)
  4. 通过算术类型转换实现的匹配,所有转换等级都一样;
  5. 通过类类型转换实现的匹配。

1.4 补充说明

当函数重载与类这两个概念发生联系的时候,我们需要有几点问题需要注意。

void f(int);
class A
{
void g(){f(3);}
void f(double);
}

上述情况下,成员函数g中调用的f是哪一个?

名字查找(name lookup):

  • 在名字所在块中寻找其声明语句,只考虑在名字的使用之前出现的声明;
  • 如果没找到,继续查找外层作用域;
  • 最终没找到,程序报错。

这就牵扯到了类中名字查找的一些特点:

类作用域的特点是:编译器分两步来处理:首先编译成员的声明,然后才轮到成员函数体。因此,成员函数体可以随意使用类中的其他成员而无须在意这些成员出现的次序。

成员函数中使用的名字解析方式如下:

  • 在成员函数内查找该名字的声明。和前面一样,只有在函数使用之前出现的声明才被考虑。
  • 如果成员函数内没有找到,则在类内继续查找;
  • 如果类内也没有找到,在成员函数定义之前的作用域内继续查找。

第二个问题是由运算符重载引起的。

a sym b

可能调用的是:

a.operatorsym(b);//a 的成员函数
operatorsym(a, b);//普通函数

当在表达式中使用重载的运算符时,要考虑上面两种情况。

2. 模板

2.1 模板与函数重载

就像引入类会给函数重载带来一些新的规则;引入模板也会给函数重载带来一些新的规则:

  • 对于一个调用,其候选函数包括所有的模板参数推断成功的函数模板实例;
  • 如果同样好的函数中只有一个是非模板函数,则选择此函数;
  • 如果同样好的函数中没有非模板参数,而有很多函数模板,且其中一个模板比其他模板更特例化,则选择此模板。(没有他的话,本质上(const T&)可以用于任何类型);
  • 否则,程序报错

ps. [具体模板参数推断、类型转换等等细节,不在此讨论]

2.2 函数模板的特例化

通用模板:

template<typename T> int compare(const T&, const T&);

特例化示例:

template<>
int compare(const char* const &p1, const char* const &p2)
{
    return strcmp(p1, p2);
}

一个特例化版本本质上是一个实例,而非函数名的一个重载版本。因此,特例化不影响函数匹配

2.3 类模板特例化(全特例化)

通用情况:

template<typename T>
class hash
{
}

特例化:

template<>
class hash<SaleData>
{
}

2.4 类模板部分特例化

不指定所有模板参数实参。只提供一部分模板参数或是参数的一部分而非全部特性。

通用版本:

tempalate<typename T> class remove_reference
{
typedef T type;
}

部分特例化版本:

template<typename T> class remove_reference<T&> //左值引用
{
typedef T type;
}

3. 应用

参考侯捷的《STL源码剖析》。

3.1 迭代器设计

现在我们需要这么一个功能,对于函数f,输入为迭代器,输出为迭代器的值。
这在C++11中很简单:

1 template<typename It>
2 auto f(It beg, It end) ->decltype(*beg)
3 {
4     return *beg;
5 }

但是在这之前,没有auto与decltype的时候,应该怎么实现呢?
我们假设所有的迭代器都有:

template<class T> class Iter
{
typedef T value_type;
}

那么就可以实现:

template<class It>
typename It::value_type f(It it)
{
return *it;
}

那么问题来了,我们的程序基于一个假设:所有的迭代器有value_type。
然而C++原生迭代器——指针——就不符合这个假定。
怎么办?需要使用特例化:

template<class T> T f(T* it) //迭代器是指针的情况
{
    return *it;
}

3.2 POD类型处理

现在需要一个功能,将迭代器[first, last)的内容填充为类型为T的val。
我们打算对于类型T调用构造函数;
然而,问题是int,float等等类型不需要构造函数,所以我们需要根据val来判断类型——而这正是C++所欠缺的。
那么我们可以针对这些POD类型进行特例化:

struct true_type{};
struct false_type{};

对于所有的类型有:

template<class Type>
struct type_trait
{
typedef false_type Is_POD;
}

针对char,int等POD类型有:

template<>
struct type_trait<char>
{
typedef true_type Is_POD;
}

那么,可以实现函数:

template<class It, class T>
void fill(It first, It last, const T& val)
{
fill_aux(first, last, val, value_type(first));
}
template<class It, class T, class T1>
void fill_aux(It first, It last, const T& val, T1*)
{
typedef typename type_trait<T1>::Is_POD is_POD;
fill_aux2(first, last, val, is_POD());
}
template<class It, class T>
void fill_aux2(It first, It last, const T& val, true_type)
{
for(auto it=first;it!=last;++it) *it =val;
}

template<class It, class T>
void fill_aux2(It first, It last, const T& val, false_type)
{
for(auto it=first;it!=last;++it) construct(&*it,val);
}
SpringBoot3 + OAuth2.1实战:5分钟搞定授权码模式(含完整代码) 本文详细介绍了如何在SpringBoot3环境中快速实现OAuth2.1的授权码模式,包括环境配置、核心安全实现及完整代码示例。通过Spring Security集成,开发者可以高效构建企业级安全认证系统,解决版本兼容性问题,提升开发效率。 阅读详情

相关推荐

RAW、RGB、YUV图像格式的采样与存储原理详解

本文详细解析了RAW、RGB和YUV三种核心图像格式的采样与存储原理。RAW是传感器原始数据,信息完整但需后期处理;RGB直接对应显示,直观但数据量大;YUV通过亮色分离与色度下采样,在保证观感的前提下大幅提升传输与存储效率,是视频编码与流媒体的主流格式。理解其差异是图像处理与视频开发的基础。

e4f5g6h7的博客 516

C++ decltype 类型推导

C++11 引入了 decltype 说明符,decltype 可以获取一个对象或者表达式的类型。除了可以推导表达式的类型,还可以用来推导类中的非静态成员变量的类型((在泛型编程的情况下只能表现引用语义的表达能力是不够的),就可以使用。如果不存在这样的类型(比如表达式里的变量不在当前作用域内)或者。要求是编译期确定返回类型),则无法进行推导。这就是上面的那个例子返回的是一个引用的原因。,返回一个引用,所以我们的断言可以通过。推断出的类型是其返回值的类型。是类的成员变量时,要同步。加上括号,推导的类型没有。

RJ_theMag的博客 594

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

征服C++ 11视频精讲

【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。

用VINS-Fusion跑通EuRoC数据集:Ubuntu22.04+ROS2环境下的保姆级评测指南

本文详细介绍了在Ubuntu22.04和ROS2 Humble环境下使用VINS-Fusion处理EuRoC数据集的完整流程。从环境配置、数据集转换到参数调优和性能评估,提供了一套全面的多传感器融合分析方案,帮助开发者在无人机精准定位场景中实现高效部署与优化。

weixin_29212867的博客 517

CentOS 7环境下GLPI与OCS Inventory资产管理系统集成部署指南

本文详细介绍了在CentOS 7环境下,如何将GLPI与OCS Inventory两大开源工具进行集成部署,构建自动化资产管理系统。指南涵盖环境准备、核心服务安装、Web界面初始化、OCS插件配置及资产同步实战,帮助运维人员实现IT资产的自动发现、统一管理与可视化,大幅提升资产管理效率。

weixin_29274337的博客 327

C++语言基础到进阶

《从c语言入门到c++使用高手》套餐地址链接:https://edu.youkuaiyun.com/combo/detail/1046《从C语言入门到c++网络通讯架构师》套餐地址链接:https://edu.youkuaiyun.com/combo/detail/1165 

思科路由器、交换机组网实验报告

通过思科模拟器搭建路由交换网络

ghj528的博客 1335

——Day.27——C++基础——函数的默认参数、函数重载、函数模板、实例化与具体化

本次内容比较具体,都是c++一些特有的功能,在一些特定情况下作用非常大。 函数 默认参数 简而言之就是:调用该函数时,有些参数可以省略,函数自动使用其默认的参数。 int add(int a, int b = 1); //如果不输入b对应的参数,则默认b等于1 int x = 9, y = 10; sum = add(x, y); //这是传统方式 sum = add(x); //...

敏而好学无止境 203

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用

一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制

丨晋丨 1858

《嵌入式最全面试题-Offer直通车》目录

嵌入式领域蓬勃发展,嵌入式工程师成为众多科技企业争抢的热门人才。如果你渴望在嵌入式面试中脱颖而出,成功斩获心仪的 offer,那么《嵌入式最全面试题 - Offer直通车》将是你的绝佳选择。本专栏是优快云是热门专栏,100多篇文章,总字数过百万。每月新增订阅用户过百,现在是优惠价9.9元,后面要逐渐恢复原价,早订阅早受益。本专栏精心整理了众多超万字的精华内容,总计达数十万字的嵌入式面试题总结。涵盖从嵌入式基础知识到各大厂面试真题,从驱动开发到操作系统,从硬件到软件等各个方面。

大模型大数据攻城狮的专栏 8401

Effective c++--智能指针 & 函数模板

Shared_ptr允许当智能指针被建立起来是指定一个资源释放函数绑定于智能指针身上,也就是说在shared_ptr被初始化的同时也可以指定其管理的资源的释放函数。Shared_ptr提供的某个构造函数接受两个实参:一个是被管理的指针,另一个是引用次数变为0时将被调用的“删除器”。Shared_ptr构造函数坚持其第一个参数必须是个指针。它支持定制型删除器。   缺省情况下C++以by val

鱼思故渊的专栏 1199

apple游客下单逆向分析

Apple游客下单Cookies注册激活流程逆向分析与算法实现

吴秋霖的博客 2001

【c++】cpp多态

c++多态知识与原理

hutaotaotao的博客 1306

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【CPP】类与多态

例如典中典的火车票的例子,设计一个自助售票函数,设计一个父类为乘客,设计一个子类继承自父类为学生,再设计一个子类继承自父类为军人,每个种乘客类型可以买不同价格的票,当这类对象作为参数(传引用/指针)传进一个为父类"乘客"的自助售票函数中,根据函数判断生成符合当前乘客身份的票。覆写的概念很重要,从字面意思咱就知道,子类的情况可能会和父类不太一样,此时我们就可以覆写掉父类的方法,改成我们想让子类所呈现的模式,当然,这里的覆写在底层的角度上其实说不上是覆写,这个后面的小节会提到。

2302_79981653的博客 1343

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++ 多态 运行时多态和编译时多态_cpp和java中多态的理解

今天写一些小技巧帮助理解cpp和java里的多态,因为c++和java在多态的实现上,稍微有一点点不同,所以这里也会列出两者的不同,以免有时候会混淆。多态是所有面向对象的编程语言中非常重要的一个特性,多态的实现,可以允许在程序运行过程中,父对象根据当前赋给他值的子对象和特性决定调用自己的方法还是子类中复写的方法。1. c++多态c++中可以通过现下面四组概念来帮助我们理解和判断多态:对象的静态类型...

weixin_39628384的博客 314

深度学习工具包 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++的多态.cpp

/*多态包括模板/重载和虚函数 *其中模板和重载属于静态多态虚函数属于动态多态 */# include using namespace std;//定义模板类template class Base {public: Base():x_(0){}; Base(T n):x_(n){};    ~Base(){ cout }; virtual T Get() { //虚函数,当基类指针指向派生

东哥的博客 393

CPP多态

本文涉及的指针大小为x86系统32位4字节,如果是x64程序,则需要考虑指针是8bytes问题等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。

z202331720425的博客 1390

多态_cpp

一、什么是多态? 1.多态的概念 在面向对象方法:向不同的对象发送同一个消息,不同的对象在接收的时会产生不同的行为(即方法) 在C++中,多态性的表现形式之一:具有不同功能的函数可用同一个函数名,这样就可以实现用一个函数名调不同内容的函数。 用现实生活中的例子来说一下动态,比如说:学校开学,不同身份的人会有不同的反应。比如老师要备课上课

apt1203JN的博客 705

cpp中的多态

多态的实现依赖于继承,在继承的基础上实现。多态需要基类和派生类的目标函数完成三同:名字同,返回值同,参数类型同。想要实现多态,还有两个重要条件:1.必须是基类的指针或者引用调用了虚函数。只有基类的指针或者引用才能即指向基类又指向派生类。2.被调用的必须是虚函数,并且完成了虚函数的重写/覆盖。使得基类和派生类有不同的函数。

weixin_69318410的博客 745

cpp中三种多态

cpp中三种多态 多态(Polymorphism)是一个大家耳熟能详的概念。在传统的C++教学中,我们通常认为“多态”是函数在类继承体系中所表现出来的一种行为。比如,在下面的例子中, template <typename T> T convertFromInt(int v); void f1() { convertFromInt<float>(5); convertFromInt<double>(5); } struct Base { virt

惜兰blog 1145

Cpp中关于多态那些事

多态(可以有多种变化的情况奥)

Template Code 842

C++——多态

上述文章我们了解什么是多态,了解了多态的原理,希望对你有所帮助。

2301_76613753的博客 2046

C++多态

C++中的多态分为静态多态和动态多态两种,其中: 静态多态在编译阶段实现,其原理是由函数重载实现,通过不同的实参调用其相应的同名函数。 动态多态通过虚函数实现,以下着重介绍 动态多态的两个必要条件: 必须通过基类的指针或者引用调用 被调用的必须是虚函数,且在派生类中实现了该虚函数的重写 以下解释何为通过基类的指针或者引用调用 int main() { Person p; student s; Person &tmp1 = p; Person &tmp2 = s;//tm

weixin_50569901的博客 1万+

【C++】多态

多态的概念多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为,这⾥我们重点讲运⾏时多态。**编译时多态(静态多态)**主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。,具体点就是去完成某个⾏为(函数),可以传不同的对象就会完成不同的⾏为,就达到多种形态。⽐如买票这个⾏为,当普通⼈买票时,是全价买票;

Octopus2077的博客 2015

Cpp_多态

一、虚函数、覆盖和多态如果将基类中的某个成员函数声明为虚函数,那么其子类中与该函数具有相同原型的成员函数就也是虚函数,并且对基类中的版本形成覆盖。这时,通过指向子类对象的基类指针,或者引用子类对象的基类引用,调用虚函数,实际被执行的将是子类中的覆盖版本,而非基类中的原始版本,这种语法现象被称为多态。二、虚函数覆盖的条件1.只有类的成员函数才能被声明为虚函数,全局函数和类的静态成员函数都不能被声明为虚

Jerry的专栏 2795
上一篇: C++动态内存
下一篇: Qt实现的软件外观
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值