C 學習第三天之方法與函式

2021-08-14 08:26:42 字數 3976 閱讀 3513

乙個方法是把一些相關的語句組織在一起,用來執行乙個任務的語句塊。每乙個 c# 程式至少有乙個帶有 main 方法的類。

要使用乙個方法,您需要:

當定義乙個方法時,從根本上說是在宣告它的結構的元素。在 c# 中,定義方法的語法如下:

(parameter list)

下面是方法的各個元素:

下面的**片段顯示乙個函式 findmax,它接受兩個整數值,並返回兩個中的較大值。它有 public 訪問修飾符,所以它可以使用類的例項從類的外部進行訪問。

class numbermanipulator

...}

您可以使用方法名呼叫方法。下面的例項演示了這點:

using system;

static void main(string args)

", ret );

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

最大值是: 200
您也可以使用類的例項從另乙個類中呼叫其他類的公有方法。例如,方法 findmax 屬於 numbermanipulator 類,您可以從另乙個類 test 中呼叫它。

using system;

}class test

", ret );

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

最大值是: 200
乙個方法可以自我呼叫。這就是所謂的遞迴。下面的例項使用遞迴函式計算乙個數的階乘:

using system;

else

}static void main(string args)

", n.factorial(6));

console.writeline("7 的階乘是: ", n.factorial(7));

console.writeline("8 的階乘是: ", n.factorial(8));

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

6 的階乘是: 720

7 的階乘是: 5040

8 的階乘是: 40320

當呼叫帶有引數的方法時,您需要向方法傳遞引數。在 c# 中,有三種向方法傳遞引數的方式:

方式描述

值引數這種方式複製引數的實際值給函式的形式引數,實參和形參使用的是兩個不同記憶體中的值。在這種情況下,當形參的值發生改變時,不會影響實參的值,從而保證了實參資料的安全。

引用引數

這種方式複製引數的記憶體位置的引用給形式引數。這意味著,當形參的值發生改變時,同時也改變實參的值。

輸出引數

這種方式可以返回多個值。

這是引數傳遞的預設方式。在這種方式下,當呼叫乙個方法時,會為每個值引數建立乙個新的儲存位置。

實際引數的值會複製給形參,實參和形參使用的是兩個不同記憶體中的值。所以,當形參的值發生改變時,不會影響實參的值,從而保證了實參資料的安全。下面的例項演示了這個概念:

using system;

static void main(string args)

", a);

console.writeline("在交換之前,b 的值: ", b);

/* 呼叫函式來交換值 */

n.swap(a, b);

console.writeline("在交換之後,a 的值: ", a);

console.writeline("在交換之後,b 的值: ", b);

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

在交換之前,a 的值:100

在交換之前,b 的值:200

在交換之後,a 的值:100

在交換之後,b 的值:200

結果表明,即使在函式內改變了值,值也沒有發生任何的變化。

引用引數是乙個對變數的記憶體位置的引用。當按引用傳遞引數時,與值引數不同的是,

它不會為這些引數建立乙個新的儲存位置

。引用引數表示與提供給方法的實際引數具有相同的記憶體位置。

在 c# 中,使用ref關鍵字宣告引用引數。下面的例項演示了這點:

using system;

static void main(string args)

", a);

console.writeline("在交換之前,b 的值: ", b);

/* 呼叫函式來交換值 */

n.swap(ref a, ref b);

//注意加上ref

console.writeline("在交換之後,a 的值: ", a);

console.writeline("在交換之後,b 的值: ", b);

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

在交換之前,a 的值:100

在交換之前,b 的值:200

在交換之後,a 的值:200

在交換之後,b 的值:100

結果表明,swap 函式內的值改變了,且這個改變可以在 main 函式中反映出來。

return 語句可用於只從函式中返回乙個值。但是,可以使用輸出引數來從函式中返回兩個值。輸出引數會把方法輸出的資料賦給自己,其他方面與引用引數相似。

下面的例項演示了這點:

using system;

static void main(string args)

", a);

/* 呼叫函式來獲取值 */

n.getvalue(out a);

console.writeline("在方法呼叫之後,a 的值: ", a);

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果:

在方法呼叫之前,a 的值: 100

在方法呼叫之後,a 的值: 5

提供給輸出引數的變數不需要賦值。當需要從乙個引數沒有指定初始值的方法中返回值時,輸出引數特別有用。請看下面的例項,來理解這一點:

using system;

static void main(string args)

", a);

console.writeline("在方法呼叫之後,b 的值: ", b);

console.readline();}}

}

當上面的**被編譯和執行時,它會產生下列結果(取決於使用者輸入):

請輸入第乙個值:

7請輸入第二個值:

8在方法呼叫之後,a 的值: 7

在方法呼叫之後,b 的值: 8

十一年話

142***[email protected]

參考位址

ref 和 out 的區別

乙個用關鍵字 ref 標示,乙個用 out 標示。

牽扯到資料是引用型別還是值型別。

一般用這兩個關鍵字你是想呼叫乙個函式將某個值型別的資料通過乙個函式後進行更改。傳 out 定義的引數進去的時候這個引數在函式內部必須初始化。否則是不能進行編譯的。ref 和 out 都是傳遞資料的位址,正因為傳了位址,才能對源資料進行修改。

一般情況下不加 ref 或者 out 的時候,傳值型別的資料進去實際上傳進去的是源資料的乙個副本,也就是在記憶體中新開闢了一塊空間,這裡面存的值是與源資料相等的,這也就是為什麼在傳值型別資料的時候你如果不用 return 是無法修改原值的原因。但是你如果用了 ref,或者 out,這一切問題都解決了,因為他們傳的是位址。

out 比起 ref 來說,還有乙個用法就是可以作為多返回值來用,都知道函式只能有乙個返回值,c#裡,如果你想讓乙個函式有多個返回值,那麼out能很容易解決。

C 學習第三天

一些基礎就可以略過了,看書不能太呆板。如果把一本書看完了,剩下的就是在實際專案中進行整合,訓練,然後整理成筆記。每天敲點程式,記點筆記。變數作用域 include include include std string s1 hello 全域性int main 結果 hello world 42 wo...

第三天 c 學習

1 void my function const a 常引用 目的是為了使得實參不可以被修改 2 函式過載 函式引數預定義值會產生二義性 3 public 類的內外部都可以被訪問 porivate 只能在類的內部被訪問 protected 用在類的內部 繼承 4 析構 先建立的物件後析構,遵循堆疊原...

C 學習第三天

今天是學習的第三天,主要學習內容如下 1.c 字符集 2.識別符號構成規則 3.c 資料型別 4.轉義字元 5.符號常量 6.基本算數運算子 7.符合算數運算子 寫 抄 了個程式 include 讓程式包含iostream類 using namespace std 開啟命名空間,使用iostream...