Objective C 多引數成員函式 好文收藏

2021-07-04 07:58:14 字數 1860 閱讀 6528

初學oc,乍看其函式語法感覺好怪,不明白為什麼oc的函式每個引數要分別有兩個名字。網查下面這篇文講還算不錯,收藏。

==更新==

ios學徒 第二本原來有講到oc多引數函式的語法,其中有副圖總結的不錯,收藏如下:

多個引數的寫法

(方法的資料型別)函式名:(引數1資料型別)引數1的數值的名字 引數2的名字: (引數2資料型別) 引數2值的名字 …. ;

舉個例子,乙個方法的定義:

-(void) setkids: (nsstring *)myoldestkidname secondkid: (nsstring *) mysecondoldestkidname thirdkid: (nsstring *) mythirdoldestkidname;

實現這個函式的時候:

-(void) setkids: (nsstring *)myoldestkidname secondkid: (nsstring *) mysecondoldestkidname thirdkid: (nsstring *) mythirdoldestkidname

呼叫的時候:

kids *mykids = [[kids alloc] init];

[mykids setkids: @」張大力」 secondkid: @」張二力」 thirdkid: @」張小力」];

一上內容為引用 ,引用位址tp:

剛開始接觸objective-c的時候,會感覺這種函式宣告和呼叫都有點怪,實際是受c和c++傳統函式宣告方式的影響,看會c++的函式宣告

void setkids(string *myoldestkidname , string *mysecondoldestkidname , string *mythirdoldestkidname);

呼叫的時候:

mykids.setkids("張大力","張二力","張小力");

在c++裡,以我們的觀點這個函式的」函式名「是setkids,然後()內是引數型別和形參變數

c++中有overload(過載)的概念,我們可以宣告void setkid(int myoldestkidage , string *mysecondoldestkidname , string *mythirdoldestkidname);

編譯器是如何識別這兩函式呢,實際是對於編譯器會將所有引數的型別加到函式名上,變成setkid_string_string_string 和setkid_int_string_string (這裡忽略了this等隱藏引數)

對於編譯器我們的兩個setkid原本就是不同的,過載只是對於我們而言。

對於objective-c中,許多人認為「objective-c中參數列是這樣的, 引數名:(資料型別)形參名。第乙個引數的引數名就是函式名」,其實這種理解不太正確,對於objetive-c的函式名應該是由所有引數名的組合的,如上例中函式名是setkid:secondkid:thirdkid: 有使用過@selector的同學,會知道我們使用@selector獲得帶三個引數的函式的sel型別(可以當函式識別符號理解)需要這樣用@selector(setkid:secondkid:thirdkid)。

所以我的理解時函式名是setkid:secondkid:thirdkid: ,而setkid實際是第乙個引數的引數名。

這有乙個問題是objecitve-c為什麼不像c++一樣,直接使用形參的資料型別放到函式名裡,而非要讓我們給每乙個形參定義乙個引數名呢。這是因為過載的方法只在類的內部,在c++中如果讓同一函式在子類父類的不同物件中執行相同函式名有不同的實現,過載是辦不到的,我們需要加vitrual關鍵字,把它宣告成虛函式,這就是多型。在objetive-c中所有的函式均是具有多型特性的,都可在執行時動態執行呼叫,我們需要一種方式對於所有的同名函式,在不同的物件可以動態執行,這時候objetive-c便選擇了中綴表達方式。

C 函式成員

函式成員提供了操作類中資料的某些功能,包括方法 屬性 建構函式和析構函式 運算子以及索引器。方法是與某個類相關的函式,他們可以是例項方法,也可以是靜態方法。例項方法處理類的某個例項,靜態方法提供了更一般的功能,不需要例項化乙個類 例如console.writeline 方法 屬性是可以再客戶機上方為...

c 靜態成員和常數成員

靜態成員包括靜態資料成員和靜態成員函式 常數成員包括常量資料成員和常成員函式 靜態成員屬於類,不屬於物件 靜態資料成員和常量資料成員被簡單函式呼叫時與簡單資料成員一致 geta 不同點在於 1,靜態資料成員在外部定義使用 classname staticname的方式 2,常量資料成員在初始化時賦值...

objective c 多引數方法的定義與呼叫

方法定義舉例 void insertobject id anobject atindex nsinteger index 各部分解釋 1.方法修飾符 代表此方法是實體方法,必須先生成類例項,通過例項才能呼叫該方法。代表此方法是類的靜態方法,可以直接呼叫,而不用生成類例項。2.引數型別 id 與 ns...