C++那些细节--static_cast,dynamic_cast,const_casst,reinterpret_cast

C++11 reinterpret_cast讲解 我觉得C++里面有一个很神奇的转换叫reinterpret_cast(类型不相关转换),它和诸如static_cast、dynamic_cast都不一样,这种转换有时候让人摸不到头脑,但是有些场景非常有用。简而言之,类型不相关的转换。但是不是说可以随便转换,它主要用在指针与指针之间,指针和long之间等等。必要条件是两种类型之间必须有相同的位模式,而且转换过后不能直接拿来用,必须转换回来才能使用。1、研究了很久还是决定拿出来掰扯掰扯。 阅读详情

恩,这四个cast,之前一直没怎么搞懂,在使用类型转化时仍然经常使用C风格的转化,而且之前的一次笔试题竟然考的就是这道题,好吧,我强迫症又犯了,一定要彻底搞懂...


一.概述

1.(typename)element:C风格的强制转化,貌似通吃,但是既然用了C++,还有分门别类的cast,是时候放弃这个了。

2. static_cast<typename>(element):通常转换,没有运行时的检测,在不知道用哪个的时候用这个就好了。

3. dynamic_cast<typename>(element) :动态转换,有运行时检测,通常在基类和派生类之间转换时使用。

4. const_cast<typename>(element):主要针对const和volatile的转换,去除const属性

5. reinterpret_cast<typename>(element):用于没有任何关联的类型转换,慎用


俗话说得好,实践是检验真理的唯一标准,要想清楚的知道每种转化会发生什么,最好的办法就是写个demo,而不是看别人的blog怎么写,自己就怎么说,这样印象不深刻,而且可能人云亦云,没有自己的想法。


二.static_cast

关于static_cast,最常用的一个转化,当我们不知道用哪个cast的时候,static_cast是最好的选择。但是这个转换没有运行时类型检查保证转换的安全性。允许任意的隐式转换以及相反的转换动作。具体的转化功能如下:
1.基本数据类型之间的转化,如Int转化为char之类的
2.void*类型的指针转化为其他类型的指针
3.其他类型的指针转化为void*类型的指针
4.子类指针转化为父类指针(向上转型,安全,不写static_cast也会发生隐式转换)
5.父类指针转化为子类指针(向下转型,不一定安全,如果调用子类特有字段属性会出错)

注意:
1.static_cast不能转换掉const,volitale属性
2.在基本的类型或者上下转型时,被转化的对象和要转化成的对象要类型一致,如果在两个不相干的类型中转化,会编译出错。

好的,下面是针对这5点的一个例子:

// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class CastTestBase
{
public:
	CastTestBase(string n):name(n)
	{

	}

	~CastTestBase()
	{

	}

	void ShowBase()
	{
		cout<<"show base, name is : "<<name<<endl;
	}
private:
	string name;
};

class CastTestChild : public CastTestBase
{
public:
	CastTestChild(string n, string cn) : CastTestBase(n), childname(cn)
	{

	}

	~CastTestChild()
	{

	}

	void ShowChild()
	{
		cout<<"show child, name is: "<<childname<<endl;
	}
private:
	string childname;
};

void TestFunc1(int* num)
{
	cout<<"num is "<<*num<<endl;
}

void TestFunc2(void* pointer)
{
	cout<<"num is "<<(*static_cast<int*>(pointer))<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	//static_cast转换内置数据类型
	int a = 10;
	char b = static_cast<char>(a);

	//void*型指针转化为其他类型指针
	void* pointer = new int(1);
	TestFunc1(static_cast<int*>(pointer));

	//其他任何类型指针转化为void*型指针
	int* num = new int(2);
	TestFunc2(num);

	//子类指针转化为父类指针(安全,不写static_cast也可以执行隐式转换)
	CastTestBase* basePointer = static_cast<CastTestBase*>(new CastTestChild("child", "child"));
	basePointer->ShowBase();

	//父类指针转化为子类指针(不一定安全,如果调用子类特有的内容会出错)
	CastTestChild* childPointer = static_cast<CastTestChild*>(new CastTestBase("base"));
	//childPointer->ShowChild();//这样会出错的,父类并没有childname字段。而如果只调用函数没有问题,使用字段会出现问题
	childPointer->ShowBase();

	system("pause");
	return 0;
}

结果:
num is 1
num is 2
show base, name is : child
show base, name is : base
请按任意键继续. . .

//childPointer->ShowChild();//这样会出错的,父类并没有childname字段。而如果只调用函数没有问题,使用字段会出现问题
这句如果运行,会有问题,即编译不会出错,不会检查类型转换的问题,在运行时直接崩掉。


三.dynamic_cast

从字面上理解是动态转化,其实就是增加了运行时检查的机制,如果转化不对,在运行时会返回一个空指针,我们可以通过判断转化的结果是否为空来判断转化是否成功,而不会像static_cast一样直接崩掉。不过,既然加了运行时检查,在运行时肯定会有性能的损失。

dynamic_cast运用于下面的情况:
只能用于指针或者引用,主要用于执行带有安全检测的向上转型或者向下转型,不过向上转型可以有隐式转化,并且是安全的,所以主要是用于向下转型的检测。
1.基类有虚函数时,可以向上或者向下转型,在向下转型时可以判断转换是否能返回一个完整的对象,在运行时检测。如果有问题,返回一个空指针
2.基类没有虚函数时,只能进行向上转型,然而向上转型并不需要dynamic_cast,隐式转化也可以,否则编译出错。

// C++Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class CastTestBase
{
public:
	CastTestBase(string n):name(n)
	{

	}

	~CastTestBase()
	{

	}

	void ShowBase()
	{
		cout<<"show base in base, name is : "<<name<<endl;
	}

	virtual void ShowChild()
	{
		cout<<"show child in base"<<endl;
	}
private:
	string name;
};

class CastTestChild : public CastTestBase
{
public:
	CastTestChild(string n, string cn) : CastTestBase(n), childname(cn)
	{

	}

	~CastTestChild()
	{

	}

	virtual void ShowChild() override
	{
		cout<<"show child in child, name is: "<<childname<<endl;
	}
private:
	string childname;
};

int _tmain(int argc, _TCHAR* argv[])
{
	//子类指针转化为父类指针(安全,不写static_cast也可以执行隐式转换)
	CastTestBase* basePointer = dynamic_cast<CastTestBase*>(new CastTestChild("child", "child"));
	basePointer->ShowBase();
	basePointer->ShowChild();

	//父类指针转化为子类指针(不一定安全,如果调用子类特有的内容会出错)
	CastTestChild* childPointer = dynamic_cast<CastTestChild*>(new CastTestBase("base"));
	if (childPointer)//dynamic_cast的返回值可能是NULL,切记!!!
	{
		childPointer->ShowBase();
		childPointer->ShowChild();//这样会出错的,父类并没有childname字段。而如果只调用函数没有问题,使用字段会出现问题
	}
	else
		cout<<"dynamic_cast failed!"<<endl;
	

	system("pause");
	return 0;
}

结果:
show base in base, name is : child
show child in child, name is: child
dynamic_cast failed!
请按任意键继续. . .

这里,由于和上面static_cast一样的原因,showchilid本应该出错,但是在转化过程中,dynamic_cast判断出了转化会出问题,所以直接返回了一个空指针,让我们可以根据这个进行处理,就避免了程序直接莫名的崩溃...


四.const_cast

用于修改类型的const或者volatile属性,类型不会有变化,只是去掉前面的修饰符。

int _tmain(int argc, _TCHAR* argv[])
{
	const int a = 10;
	//a = 20;不能修改常量
	//int b = const_cast<int>(a);<>中的即要转化的对象必须是指针或者引用
	int* b = const_cast<int*>(&a);
	//int* b = &a;const int 类型的实体不能使用int*类型的指针指向
	*b = 20;
	cout<<*b<<endl;
	
	//int& c = a;非const引用不能引用const变量
	int& c = const_cast<int&>(a);
	c = 30;
	cout<<c<<endl;

	system("pause");
	return 0;
}


使用const_cast时要注意,const_cast并非直接修改变量,而是只能通过指针或者引用来去除const限定符,即 const_cast的<>中只能接受引用或者指针类型的对象。不能直接放入数据类型。转换之后仍然指向或者引用原来的对象,但是常量对象被转化为非常量对象。

C++有const类型,就是让我们不改变变量的内容,但是还是提供了去除这一个限制的方法,可见C++的灵活!!!



五.reinpreter_cast

这个最简单粗暴...甭管是啥,都能转。类型可以是指针,引用,基本数据类型,函数指针,或者成员指针。甚至可以将int转化为一个指针...这种转化根本不会检查转化的合理性,只是拷贝数据,强制转化。

这个东东还是慎用吧,如果他说什么都能干,感觉可能什么都干不好...还是术业有专攻的好...




参考链接:http://m.blog.youkuaiyun.com/blog/pizi0475/46794631

http://blog.youkuaiyun.com/starryheavens/article/details/4617637



EEGLAB合辑 | 第一节 往EEGLAB导入数据 1、学习Matlab EEGLAB图形界面建立在强大的Matlab脚本语言之上。要使用EEGLAB构建宏命令和执行自定义和自动化处理的全部功能,就需要能够在Matlab中操纵EEGLAB数据结构。由于时间限制,这个wiki没有提供关于Matlab脚本语言的介绍。相反,用户需要在开始研究之前熟悉Matlab。 2、安装EEGLAB和教程文件 首先下载包含教程数据集的EEGLAB(30MB),附下载地址。 (https://sccn.ucsd.edu/eeglab/downloadtoolbox.php) 解压 阅读详情

相关推荐

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全

SOLIDWORKS无法获得下列许可 无效的使用许可号码(-8,544,0) 解决办法大全。版本:SolidWorks2021。电脑:惠普战66四代。软件安装不困难!

qq_43596278的博客 11万+

C++标准转换运算符之 reinterpret_cast

reinterpret_cast 转换 通过重新解释底层位模式在类型间转换。 语法 reinterpret_cast <新类型> (表达式) 解释 与static_cast不同,但与const_cast类似,reinterpret_cast表达式不会编译成任何 CPU 指令(除非在整数和指针间转换,或在指针表示依赖其类型的不明架构上)。它纯粹是一个编译...

学之知之的博客 4万+

Qt界面编程(三)—— 父子关系、对象树、信号和槽(自定义信号和槽、Qt5与Qt4的写法)

Qt框架默认提供的标准信号和槽不足以完成我们日常应用开发的需求,比如说点击某个按钮让另一个按钮的文字改变,这时候标准信号和槽就没有提供这样的函数。但是Qt信号和槽机制提供了允许我们自己设计自己的信号和槽。声明在类的signals域下没有返回值,void类型的函数只有函数声明,没有定义可以有参数,可以重载通过emit关键字来触发信号,形式:emit object->sig(参数);

此心光明事上练的博客 1695

C++基础#23:C++中的reinterpret_cast,数据类型转换

C++还提供了reinterpret_cast用于任意类型的转换,即reinterpret_cast运算符允许将任意指针转换到其他指针类型,也允许做任意整数类型和任意指针类型之间的转换。转换时,执行的是逐个比特复制的操作。

记录和分享程序人生的点点滴滴 3万+

AI编程工具深度横评2026:Claude Code × Cursor × Trae × OpenCode,7场景实测+完整免费配置

2026年AI编程工具已进入"自主Agent"时代:Claude Code以80.8% SWE-bench得分领跑编程能力,Cursor 3在用户体验和多Agent协作方面突出,GitHub Copilot保持企业市场优势。这些工具分别代表不同的使用哲学:命令行原生、IDE分支、平台集成、编辑器扩展和后起之秀。本文从开发者视角出发,通过7个真实编程场景的系统性测试,给出每款工具在具体场景下的表现评估和免费使用完整配置方案。所有代码均可直接复制运行,所有工具均有免费使用路径。

撂爪就忘的博客 5780

解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题

在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1;

hanye2020的博客 3576

【C++类型转换】4种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast

4种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast是为了规范C语言的类型转换

m0_72964546的博客 966

论文阅读笔记:Extended Vision Transformer (ExViT) for Land Use and Land Cover Classification

注意力机制驱动的深度模型最近取得了成功,如最具代表性的视觉转换器(ViT),吸引了一波高级研究来探索它们对更广泛领域的适应。然而,遥感(RS)领域中基于Transformer的方法更关注单模态数据,这可能会在充分利用不断增长的多模态地球观测数据时失去可扩展性。为此,我们提出了一种新的多模式深度学习框架,通过在最小修改的情况下扩展传统的ViT,针对土地利用和土地覆盖(LULC)分类任务。

嗑研狗的日常 945

C++基础#24:C++中的const_cast,数据类型转换

C++中的const_cast运算符用于修改类型的const或volatile属性,从而强制消除对象的常量性。使用const_cast去除const限定的目的并不是为了修改它的内容。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。

记录和分享程序人生的点点滴滴 3435

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置)

本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。

yhn45678901的博客 833

ZEMAX知识点:坐标间断面(coordinate break)

zemax知识点:坐标间断面

weixin_47638568的博客 1万+

C++新特性09_强制转换reinterpret_cast(等价于C中的显式强转;增加了代码的可读性;用于进行各种不同类型的转换;编译期处理,执行的是逐字节复制的操作,运行期不进行检查;一般不使用)

reinterpret_cast等价于C中的显式强转 1. 显式强转 int n = 1; //显式强转 int* p = (int*)n; 2. reinterpret_cast (1)用于进行各种不同类型的转换 不同类型指针之间;不同类型引用之间;指针和能容纳指针的整数类型之间的转换 (2)编译期处理,执行的是逐字节复制的操作 (3)类似于显式强转,后果自负 3.学习视频地址:强制转换reinterpret_cast 4.学习笔记:强制转换reinterpret_cast笔记 #includ

分享学习成长历程,Winter is coming! 3868

不只是CPU主频:深入解析英飞凌Aurix TC3xx各外设时钟树(CAN、以太网、Flash时序如何配置)

本文深入解析英飞凌Aurix TC3xx系列微控制器的外设时钟树配置,涵盖CAN、以太网和Flash时序的优化方法。通过详细分析时钟系统架构、关键外设配置及多外设协同设计策略,帮助工程师实现高性能汽车电子控制单元(ECU)开发。特别关注系统时钟的灵活配置与EMC优化技巧,提升系统实时性和可靠性。

weixin_29189373的博客 399

四个强制类型转换reinterpret_castconst_caststatic_cast dynamic_cast及比较

然后我们使用“reinterpret_cast”创建一个指向浮点数“fp”的指针,它获取“i”的地址并将其视为指向“浮点数”的指针。它可用于相关类型之间的转换,例如将派生类指针转换为基类指针,或执行算术转换,例如将整数转换为浮点数。我们还有一个基类“Base”和一个派生类“Derived”,并创建一个“Derived”类型的新对象并将其赋值给一个“Base*”类型的指针。我们使用“static_cast”将“i”转换为浮点数“f”,这是安全的,结果是“f”的值为 42.0。

weixin_42492218的博客 2208

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ 中 const_cast 作用详解

const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。 我们需要注意的是:变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。 用法:const_cast<type>(expression) 通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。 也就是说源类型和目标类型除了const

weixin_44218779的博客 1万+

深度学习工具包 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++四种cast转换(const_cast、static_cast、dynamic_cast、reinpreter_cast)类型转换运算符

需要注意的是,使用const_cast进行类型转换时,必须保证原始指针或引用所指向的对象是非常量的,否则修改其值将会导致未定义的行为。需要注意的是,类型转换可能会导致数据精度的损失、溢出、未定义的行为等问题,因此在进行类型转换时需要谨慎处理,避免出现错误。这种转换适用于面向过程的没有类的概念的c语言的转换,然而这样的转换符也能不分青红皂白的应用于类和类的指针,没有安全检查。需要注意的是,如果void指针指向的对象类型与目标类型不匹配,使用static_cast进行转换会导致未定义行为。

Dontla的博客 3626

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C++ 11】c++智能指针转化:static_pointer_cast、dynamic_pointer_cast、const_pointer_cast、reinterpret_pointer_ca

如果需要进行类层次上的上下行转换时,可以使用std::static_pointer_cast()、std::dynamic_pointer_cast、std::const_pointer_cast()和std::reinterpret_pointer_cast()。它们的功能和std::static_cast()、std::dynamic_cast、std::const_cast()和std::reinterpret_cast()类似。,只是dynamic_cast在进行下行转换的时候(即基类到派生类)

qq_43331089的博客 4128

C++标准转换运算符const_cast

C++提供了四个转换运算符: const_cast (expression) static_cast (expression) reinterpret_cast (expression) dynamic_cast (expression) 它们有着相同的结构,看起来像是模板方法。这些方法就是提供给开发者用来进行指针和引用的转换的。 其实我很早就想写这篇内容的,自

曹浩洋的专栏 1277

C++ 学习笔记(3) const_cast

const_cast C++的四种类型转换关键字之一, const_cast , static_cast , dynamic_cast, reinterpret_cast 。 可以去除一个 const 变量的 const 属性。 很容易理解错的一个例子: #include using namespace std ; int main () { const int data = 100

Fluence_YHL 2258

Java中CAS机制详解

传统的并发控制手段,如使用关键字或者等互斥锁机制,虽然能够有效防止资源的竞争冲突,但也可能带来额外的性能开销,如上下文切换、锁竞争导致的线程阻塞等。而此时就出现了一种乐观锁的策略,以其非阻塞、轻量级的特点,在某些场合下能更好地提升并发性能,其中最为关键的技术便是Compare And Swap(简称CAS)。CAS是一种无锁算法,它在硬件级别提供了原子性的条件更新操作,允许线程在不加锁的情况下实现对共享变量的修改。在Java中,CAS机制被广泛应用于包下的原子类以及高级并发工具类如(AQS)的实现中。

致力于不留技术债务cuizb.top 1万+

【C++】4种强制类型转换|static_cast|dynamic_cast|reinterpret_cast|const_cast---编辑中

相关讨论贴:https://bbs.youkuaiyun.com/topics/392495146 dynamic_cast 使用示例: // testCast.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <vector> using namespace std; c...

我的笔记本 1837

【C++】强制类型转换操作符 static_cast

参考: https://www.cnblogs.com/QG-whz/p/4509710.html https://blog.youkuaiyun.com/moruihong/article/details/7712260 一、简介: static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。 用法:static_cast < type-id.

lemonxiaoxiao的博客 1万+

reinterpret_cast

reinterpret_cast的原型为:reinterpret_cast (expression).type_id必须是一个指针,引用,算术类型,函数指针,成员指针等。它可以把一个整型转换为指针,也可以把一个指针转换为整型。总结来说,reinterpret_cast可以允许任何指针类型(引用)之间的转换,整型与指针类型间的转换以及指针与足够大的整型之间的转换。 reinterpret_cast

zhangchuan的博客 1万+

static_cast 剖析

前言 语法 :static_cast< 想要的类型> (原数据), 是C++中的关键字 -------在C++中,我们经常用到 隐式的类型 转换,比如 char->int , int ->double, 类层次结构中基类 和 派生类之间指针或引用的转换。 -------编译器隐式执行的任何类型转换都可以由 static_cast显式完成。 -------需要注意的是, 我们要 确保 目标数据类型 是 我们想要的类型,因为static_cast 不做 运行时的类型检查。 -----

qq_45853229的博客 7169

C++ const_cast用法

const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。 变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。 用法:const_cast(expression) 通过const_cast运算符,也只能将const type*转换为type*,将const type&amp...

TH_NUM的博客 2万+

static_cast

static_cast 基本等价于隐式转换的一种类型转换运算符,以前是编译器自动隐式转换,static_cast可使用于需要明确隐式转换的地方。c++中用static_cast用来表示明确的转换。 #include <iostream> int main() { int n = -1; char ch = 'a'; double dle = 0.1; dle = n; //c语言中的隐式转换 dle = static_cast<double&g

zhjwang的博客 2万+
上一篇: 一直以来伴随我的一些学习习惯
下一篇: 编译时和运行时的关系
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值