openFoam源码中的C++
openFoam源码中涉及到的c++思想有很多,因为在计算流体力学中,域的创建尤为重要,我们可以在域中存储我们想要的物理变量如速度、压力等等。
首先:有一个宏观上的思维,我们用的大多数域对应的C++类是GeometricField,这个类里面包含了很多信息,但他的Base类其实是Field这个类,可以用下图来表示这个关系:
分析
当然,一切要从代码看起:
首先看Field基类,找到Filed的.C和.H头文件开始分析:
该类都是在Foam这个大的命名空间底下,下面定义了很多模板类。
template<class Type>
class Field;//- Pre-declare related SubField type
template<class Type>
class SubField;template<class Type>
void writeEntry(Ostream& os, const Field<Type>&);template<class Type>
Ostream& operator<<(Ostream&, const Field<Type>&);template<class Type>
Ostream& operator<<(Ostream&, const tmp<Field<Type>>&);
// 类的前置声明
class dictionary;
这里用到了很多模板类的语法,首先声明了两个模板类的前置声明Field以及SubField,在这里要注意的是为什么要进行前置声明:
由于某些原因不方便在头文件中直接引入另一个模板类的头文件,但声明变量是需要用到该模板类型,这时候就要用到模板类的前置声明
可以看到操作符重载的参数列表里用到了Field<Type>,这就必须进行前置声明,可能此时大家又有疑问,为什么操作符的重载也要进行前置声明呢,这是可以看到在Filed这个大的模板类里有这样一段友元函数的声明:
有这样一条规定:友元函数和运算符的前向声明:如果一个模板类里调用了友元函数(外面定义的方法可以使用该类里面的私有变量),而且这个友元函数里面的参数还用到了这个模板类,那么就得提前以模板的方式去声明这个类和函数。
这样大家就懂了头文件里前面这几行的声明的必要性。下面再看这个Filed类模板里面的一些难以理解的C++代码。
class Field:public tmp<Field<Type>>::refCount,public List<Type>
首先我们看到这里的Filed继承了List,相当于我们的Filed里面存储方式为一维数组的存储。
下面定义了一个copy函数:
const UList<Type>& copySelf(const UList<Type>& mapF,tmp<Field<Type>>& tmapFcpy) const;
这里看到前后都有一个const:前面的const好理解说明这个指针不能被改变,最后这const用于修饰该函数,表示在函数内不能改变其对应对象的成员变量的值。
接下来的typedef是用来声明两个类型的,第一个typename的作用是给编译器强调后面跟的是一个类型。
typedef typename pTraits<Type>::cmptType cmptType;
typedef SubField<Type> subField;
下来该类又使用了一个内联函数, 为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,只是建议内联不代表编译器真的会执行
inline static const Field<Type>& null(){return NullObjectRef<Field<Type>>();}
下来定义了一些该类的构造器,其中比较有意思的是:
explicit Field(const label);
这里explict的解释我总结如下:
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数,
它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的
另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为
implicit(隐式).explicit声明之后,外面调用该构造函数必须显式声明,
因为构造器若只有一个参数并且默认是implicit,在外面调用的时候可以直接等于…,
编译器会自动给你补全,这样很容易产生歧义
例子:
A(int size){
…构造函数里面的变量
}
外面调用可以直接A = 10;但是这个10并不代表size,不伦不类
接下来,该类还使用了一些复制构造函数,这都是我们平常开发不经常使用的操作:
Field(const Field<Type>&);//- Copy constructor or re-use as specified.Field(Field<Type>&, bool reuse);//- Move constructor transferring the Field contentsField(Field<Type>&&);//- Copy constructor of tmp<Field>Field(const tmp<Field<Type>>&);
复制构造函数的解释:
如果类的设计者不写复制构造函数,
编译器就会自动生成复制构造函数。
大多数情况下,其作用是实现从源对象到目标对象逐个字节的复制,
即使得目标对象的每个成员变量都变得和源对象相等。
在.C文件中,我们也可以看见一些有意思的写法,比如说模板构造函数,成员变量的直接初始化等等:
const char* const Foam::Field<Type>::typeName("Field");
Foam::Field<Type>::Field(): List<Type>(){}
看懂了这个文件,在相应的找到DimensionedField和GeometricField就可以看出他们之间的继承和每次继承完以后新添的一些功能创造出了一个GeometricField这样包含很多信息的域类。
openFoam源码中的C++相关推荐
- 从OpenFOAM的源码中查找信息
从OpenFOAM的源码中查找信息 参考文章:https://blog.csdn.net/dsfsdffgfd/article/details/81841754
- MXNET源码中NDArray数据的获取和打印
虽然本人也很想写一个系列的分析文章,奈何水平不足,零零碎碎学到一点就写一点吧 本人是想学习MXNET的源码,首先想要添加一些打印,debug一下,第一个问题是如何在C++源码中打印出NDArray结构 ...
- Redis源码和java jdk源码中hashcode的不同实现
一.redis实际上是使用了siphash 这个比较简单,我说的简单是指redis代码比较少不像jdk一样调用C++代码调用栈非常深. 先看这个rehashing.c 主要就是dictKeyHash函 ...
- Caffe源码中io文件分析
Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/util/io.hpp文件 ...
- 盘点 HashMap 源码中的那些优雅的设计!
以下文章来源方志朋的博客,回复"666"获面试宝典 一.HashMap构造器 HashMap总共给我们提供了三个构造器来创建HashMap对象. 1.无参构造函数public Ha ...
- rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习
今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...
- 总结|ORB_SLAM2源码中字典使用细节
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 前段时间,主要对ORB-SLAM2中字典的训练与使用进行了些研究,关于字典的训练之前也写过一篇文 ...
- Android之在BaseAdapter源码中了解观察者模式
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/76146635 本文出自:[顾林海的博客] 个人开发的微信小程序,目前功 ...
- Mycat源码中的单例模式
在MyCat的源码中,很多对象都使用到了单例模式. 首先是MycatServer类,该实例必须全局唯一,所以这里涉及到JAVA的单实例模式,就是一个类只有唯一一个实例对象存在.先来看看mycat源码是 ...
最新文章
- 【Airtest】Airtest中swipe方法兼容不同分辨率的解决方法
- hadoop程序开发--- Java
- mysql-3 检索数据(1)
- go nocopy 不可复制的实现
- Linux Disk Quota实践
- 计算机职称考试知识点,职称计算机考试复习知识点
- 在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token
- 温度传感器利用寄存器计算出温度值
- python 学习小结(1)
- win桌面显示html,win10怎么把ie图标放桌面上 win10桌面添加ie浏览器图标的方法
- IDA工具安装、分享
- WebMagic抓取阿里司法拍卖信息
- 生活大爆炸第二季 那些精妙的台词翻译
- 计算机组成原理期中考,计算机组成原理期中考卷
- 简单普及数字人民币概论、特征、架构介绍
- 如何用搜狗拼音输入法输入希腊字母及各种上下标
- blob格式照片在前端页面的显示
- jQuery创建、添加、删除元素
- 【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(4)访问内容限制
- 填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)
热门文章
- Java黑皮书课后题第10章:*10.16(被2或3整除)找出所有被2或3整除的有50个十进制位数的前10个数字
- Java黑皮书课后题第4章:4.19(商业:检测ISBN-10)改写编程练习题3.9,将ISBN号作为一个字符串输入
- 微博 用户画像_微博/抖音/快手/小红书/B站内容营销和粉丝画像研究
- JDBC 创建连接对象的三种方式 、 properties文件的建立、编辑和信息获取
- Go websocket
- excel中如何将时间戳转换为日期格式
- 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-10系统,3行代码即可集成....
- Tomcat与Jre绿色环境配置(生产环境)
- mac java maven 设置
- js入门系列演示·数组