openFoam源码中的C++
openFoam源碼中涉及到的c++思想有很多,因?yàn)樵谟?jì)算流體力學(xué)中,域的創(chuàng)建尤為重要,我們可以在域中存儲(chǔ)我們想要的物理變量如速度、壓力等等。
首先:有一個(gè)宏觀上的思維,我們用的大多數(shù)域?qū)?yīng)的C++類是GeometricField,這個(gè)類里面包含了很多信息,但他的Base類其實(shí)是Field這個(gè)類,可以用下圖來(lái)表示這個(gè)關(guān)系:
分析
當(dāng)然,一切要從代碼看起:
首先看Field基類,找到Filed的.C和.H頭文件開(kāi)始分析:
該類都是在Foam這個(gè)大的命名空間底下,下面定義了很多模板類。
這里用到了很多模板類的語(yǔ)法,首先聲明了兩個(gè)模板類的前置聲明Field以及SubField,在這里要注意的是為什么要進(jìn)行前置聲明:
由于某些原因不方便在頭文件中直接引入另一個(gè)模板類的頭文件,但聲明變量是需要用到該模板類型,這時(shí)候就要用到模板類的前置聲明
可以看到操作符重載的參數(shù)列表里用到了Field<Type>,這就必須進(jìn)行前置聲明,可能此時(shí)大家又有疑問(wèn),為什么操作符的重載也要進(jìn)行前置聲明呢,這是可以看到在Filed這個(gè)大的模板類里有這樣一段友元函數(shù)的聲明:
有這樣一條規(guī)定:友元函數(shù)和運(yùn)算符的前向聲明:如果一個(gè)模板類里調(diào)用了友元函數(shù)(外面定義的方法可以使用該類里面的私有變量),而且這個(gè)友元函數(shù)里面的參數(shù)還用到了這個(gè)模板類,那么就得提前以模板的方式去聲明這個(gè)類和函數(shù)。
這樣大家就懂了頭文件里前面這幾行的聲明的必要性。下面再看這個(gè)Filed類模板里面的一些難以理解的C++代碼。
首先我們看到這里的Filed繼承了List,相當(dāng)于我們的Filed里面存儲(chǔ)方式為一維數(shù)組的存儲(chǔ)。
下面定義了一個(gè)copy函數(shù):
這里看到前后都有一個(gè)const:前面的const好理解說(shuō)明這個(gè)指針不能被改變,最后這const用于修飾該函數(shù),表示在函數(shù)內(nèi)不能改變其對(duì)應(yīng)對(duì)象的成員變量的值。
接下來(lái)的typedef是用來(lái)聲明兩個(gè)類型的,第一個(gè)typename的作用是給編譯器強(qiáng)調(diào)后面跟的是一個(gè)類型。
下來(lái)該類又使用了一個(gè)內(nèi)聯(lián)函數(shù), 為了解決一些頻繁調(diào)用的小函數(shù)大量消耗棧空間(棧內(nèi)存)的問(wèn)題,特別的引入了 inline 修飾符,只是建議內(nèi)聯(lián)不代表編譯器真的會(huì)執(zhí)行
inline static const Field<Type>& null(){return NullObjectRef<Field<Type>>();}下來(lái)定義了一些該類的構(gòu)造器,其中比較有意思的是:
explicit Field(const label);這里explict的解釋我總結(jié)如下:
C++中的explicit關(guān)鍵字只能用于修飾只有一個(gè)參數(shù)的類構(gòu)造函數(shù),
它的作用是表明該構(gòu)造函數(shù)是顯示的, 而非隱式的, 跟它相對(duì)應(yīng)的
另一個(gè)關(guān)鍵字是implicit, 意思是隱藏的,類構(gòu)造函數(shù)默認(rèn)情況下即聲明為
implicit(隱式).explicit聲明之后,外面調(diào)用該構(gòu)造函數(shù)必須顯式聲明,
因?yàn)闃?gòu)造器若只有一個(gè)參數(shù)并且默認(rèn)是implicit,在外面調(diào)用的時(shí)候可以直接等于…,
編譯器會(huì)自動(dòng)給你補(bǔ)全,這樣很容易產(chǎn)生歧義
例子:
A(int size){
…構(gòu)造函數(shù)里面的變量
}
外面調(diào)用可以直接A = 10;但是這個(gè)10并不代表size,不倫不類
接下來(lái),該類還使用了一些復(fù)制構(gòu)造函數(shù),這都是我們平常開(kāi)發(fā)不經(jīng)常使用的操作:
復(fù)制構(gòu)造函數(shù)的解釋:
如果類的設(shè)計(jì)者不寫(xiě)復(fù)制構(gòu)造函數(shù),
編譯器就會(huì)自動(dòng)生成復(fù)制構(gòu)造函數(shù)。
大多數(shù)情況下,其作用是實(shí)現(xiàn)從源對(duì)象到目標(biāo)對(duì)象逐個(gè)字節(jié)的復(fù)制,
即使得目標(biāo)對(duì)象的每個(gè)成員變量都變得和源對(duì)象相等。
在.C文件中,我們也可以看見(jiàn)一些有意思的寫(xiě)法,比如說(shuō)模板構(gòu)造函數(shù),成員變量的直接初始化等等:
看懂了這個(gè)文件,在相應(yīng)的找到DimensionedField和GeometricField就可以看出他們之間的繼承和每次繼承完以后新添的一些功能創(chuàng)造出了一個(gè)GeometricField這樣包含很多信息的域類。
總結(jié)
以上是生活随笔為你收集整理的openFoam源码中的C++的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 手把手教你在windows10下进行op
- 下一篇: 通过OpenFoam记录一些c++的tr