函數(shù),或者方法,在如今的編程中變得非常重要,這使得程序員不必要重復(fù)的造車(chē)輪子,直接使用別人或社區(qū)優(yōu)秀的函數(shù)來(lái)實(shí)現(xiàn)自己想要的功能。一般大型的庫(kù)函數(shù)像openCV都已經(jīng)都已經(jīng)打包好了,只要將包含關(guān)系引用到位,使用起來(lái)非常方便。但是openCV不是萬(wàn)能的,很多時(shí)候我們還需要跟多的、更加具體細(xì)微的函數(shù)來(lái)實(shí)現(xiàn)我們的目的。我們或許會(huì)請(qǐng)別人或者自己來(lái)實(shí)現(xiàn)這些常用的功能,然后保存下來(lái)以后還能方便使用。在使用Matlab的時(shí)候,自定義函數(shù)變得很簡(jiǎn)單。自需要新建一個(gè).m文件,然后按照函數(shù)定義的格式就可以了。只要該函數(shù)的路徑已經(jīng)添加在matlab路徑中或者處于當(dāng)前工作環(huán)境路徑中就可以直接引用。
在C++中,一樣可以自定義函數(shù)。比如在使用openCV的時(shí)候,我想像Matlab一樣使用subplot()函數(shù)多圖顯示,可是在openCV中我似乎并沒(méi)有找到這個(gè)函數(shù),而我自己目前也沒(méi)有能力自己來(lái)寫(xiě)一個(gè)這樣的函數(shù),于是我在網(wǎng)上找大牛們的解決方法。找到了大牛的函數(shù)Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin),我直接copy了代碼。接下來(lái)有一下幾種方法來(lái)解決:
Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin)
一、放在當(dāng)前.cpp文檔里面
將該函數(shù)直接放在含有main()函數(shù)的.cpp源文件中,如果該函數(shù)的定義放在main函數(shù)之前,那么可以像Matlab那樣直接在main()
函數(shù)中引用就好了。但是一般情況下,為了是代碼結(jié)構(gòu)清晰,自定義函數(shù)會(huì)被放在main()的后面,這時(shí)候就要在使用該函數(shù)之前做出聲明:
Mat combineImages(vector<Mat> imgs, int col, int row, bool hasMargin);
然后才是使用該函數(shù)。
二、放在另外一個(gè).cpp源文件中
使用Matlab習(xí)慣了,就會(huì)想把自定義函數(shù)放在一個(gè)新建的文件中,這樣使得結(jié)構(gòu)更加分明。其實(shí)這個(gè)Matlab也是十分相似的。在當(dāng)前工程中新建一個(gè)源文件,然后將函數(shù)的代碼拷貝進(jìn)去。要注意的是需要的函數(shù)定義的開(kāi)頭加上extern這個(gè)關(guān)鍵字,告訴編譯器這個(gè)是一個(gè)全局可使用的函數(shù),然后在main()函數(shù)使用自定義函數(shù)前同樣做出聲明即可。函數(shù)的名稱(chēng)不必要像Matlab那樣必須和源文件名稱(chēng)保持一直,甚至一個(gè)源文件中可以定義任意多個(gè)自定義函數(shù),重點(diǎn)就是加上extern關(guān)鍵字就行。目前我比較偏愛(ài)這種方法,也在用這種方法。

我的工程HelloOpenCV目前建立了兩個(gè)源文件:main_function.cpp 和 self_functions.cpp。 從字面就可以看出前者是main()所在的源文件,用來(lái)執(zhí)行的,后者是用來(lái)放自定義函數(shù)的。
目前在self_function.cpp中自定義了三個(gè)函數(shù)(具體內(nèi)容我隱藏了):

其實(shí)我現(xiàn)在還不知道在定義函數(shù)的時(shí)候,引用的庫(kù)是否需要聲明,因?yàn)槲覈L試了不聲明也可以執(zhí)行的,但是如果沒(méi)有聲明,這些引用第三庫(kù)中的函數(shù)下面有錯(cuò)誤的紅波浪線,看著不舒服。希望知道的大佬告知一聲。
然后在main()引用之前需要引用:

聲明只需要完整函數(shù)類(lèi)型,函數(shù)名和函數(shù)參數(shù)即可,不能夠賦值的。
我們同樣可以自定義變量,一般這個(gè)時(shí)候變量是一個(gè)常量。定義和使用的方法和函數(shù)一模一樣。
三、建立一個(gè)類(lèi)來(lái)
這種方法我目前還沒(méi)有使用,我的理解是當(dāng)自定義函數(shù)的數(shù)量到達(dá)一定程度的時(shí)候才需要。這個(gè)方法同樣需要我們把所有的自定義函數(shù)或者變量寫(xiě)在一個(gè)不含有main()的.cpp源文件中,然后建立一個(gè)和.cpp同名的.h的頭文件,并包含所有自定義函數(shù)和變量的聲明。在使用的時(shí)候我們自需要寫(xiě)上包含的聲明就好了。
在寫(xiě)論文階段真的很難抽時(shí)間來(lái)系統(tǒng)的學(xué)習(xí)C++,但是結(jié)合openCV 來(lái)學(xué)習(xí),對(duì)我來(lái)說(shuō)可能會(huì)事半功倍。聯(lián)系Matlab,遇到問(wèn)題一個(gè)個(gè)解決,這樣學(xué)起來(lái)更能理解C++語(yǔ)言的特點(diǎn)。當(dāng)然基礎(chǔ)還是要打牢,現(xiàn)在基本理解了C++的編程思維,以及要用到的工具。接下來(lái)會(huì)細(xì)細(xì)品味C++的魅力。