object-c 1
多個參數的寫法
(方法的數據類型)函數名:(參數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
{ ?
大兒子 = myOldestKidName; 二兒子 = mySecondOldestKidName; 三兒子 = myThirdOldestKidName;
}
調用的時候:
Kids *myKids = [[Kids alloc] init];
[myKids setKids: @”張大力” secondKid: @”張二力” thirdKid: @”張小力”];
一上內容為引用 ,引用地址tp://blog.163.com/long_wtf/blog/static/185553270201111910536/
剛開始接觸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便選擇了中綴表達方式。
轉載于:https://www.cnblogs.com/wuyuankun/p/4370061.html
總結
以上是生活随笔為你收集整理的object-c 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2014 安装小记
- 下一篇: hdu 4686 Arc of Drea