第六章 函數
函數是一個被命名了的程式碼區塊,透過呼叫函數執行對應的程式碼。
函數基礎
透過呼叫運算子(call operator)來執行函數。其形式為一對圓括號。
函數的呼叫完成兩項工作(如下),此時主調函數(calling function)的執行被暫時中斷,被調函數(called function )開始執行。
用實參初始化函數對應的形參。
將控制權轉移給被調函數。
return語句:
#傳回return語句中的值
將控制權從被調函數移回主調函數
局部物件
- ##名字有作用域,物件有
生命週期(lifetime)
自動物件(automatic object):當函數的控制路徑經過變數定義語句時建立該對象,當達到定義所在的區塊末尾時銷毀它。
局部靜態物件:程式執行路徑第一次經過物件定義語句時初始化,知道程式終止才被銷毀。
- 將局部變數定義為
static 取得,例如:
//統計函數count_calls ()被呼叫了多少次<br>size_t count_calls () <br>{ <br>static size_t ctr = 0; //呼叫結束後,這個值仍然有效<br>return ctr; <br>} <br>int main () <br>{ <br>for (size_t i = 0; i != 10; i) <br>cout return 0; <br>} <br><br>
- #也稱為
函數原型(function prototype)
- 函數三要素(
返回類型、函數名稱、形參型別)描述了函數的接口,函數宣告中形參名可省略。
- 函數應在頭檔中聲明,原始檔中定義。
- 分離式編譯
- 如果無需修改引用形參的值,最好將其宣告為常數引用。
prog -d -o ofile data0這些命令透過兩個可選的形參傳遞給main函數:
int main(int argc, char *argv[]) {...} //或: int main(int argc, char **argv) {...}當實參傳給main函數之後,argv的第一個元素指向程式的名字或一個空字串,接下來的元素一次傳遞命令列提供的實參。最後一個指標只會掉元素值保證為0。
- 以上面的命令行為範例:
argc = 5;argv[0] = "prog";argv[1] = "-d";argv[2] = "-o";argv[3] = "ofile";argv[4] = "data0";argv[5] = 0;含有可變形參的函數
- C 11新標準提供兩種方法編寫能處理不同數量實參的函數:
- 所有實參類型相同,可以傳遞一個名為initializer_list的標準函式庫類型。
- 實參類型不同,我們可以寫一個特殊的函數,叫做可變參數模板。
initializer_list形參考
- #其型別定義在同名的頭檔中
- 提供以下操作:
initializer_list<t> lst; //預設初始化,T型別元素的空白列表<br>initializer_list<t> lst{a ,b,c...}; <br>//lst的元素數量和初始值一樣多;lst的元素是對應初始值的副本;列表中的元素是const <br>lst2(lst) <br> lst2 = lst //拷貝或複製一個initializer_list物件不會拷貝清單中的元素;拷貝後,原始清單和副本元素共享<br>lst.size() //清單中元素的數量<br>lst.begin( ) //傳回指向lst中首元素的指標<br>lst.end() //傳回指向lst中尾元素下一位置的指標<br><br></t></t>
- 引用傳回左值,其他回傳型別得到右值。
列表初始化傳回值:C 11新標準規定,函數可以傳回花括號包圍的值的清單。
- 允許main函數沒有回傳值(若沒有,編譯器隱含地插入return 0)
返回0表示执行成功,其他值依机器而定。
为了使返回值与机器无关,cstdlib头文件定义了两个预处理变量,分别表示成功和失败:
<br>return EXIT_FAILURE; <br>return EXIT_SUCCESS; <br>//因为它们是预处理变量,所以既不能在前面加上std::,也不能在using声明里出现。 <br>
返回数组指针
使用类型别名
<br>typedef int arrT[10]; //arrT是一个类型别名,它表示的类型是含有10个整数的数组 <br>using arrT = int[10]; //与上一句等价 <br>arrT* func(int i); //func返回一个指向含有10个整数的数组的指针 <br>
声明一个返回数组指针的函数,形式如下
<br>Type (*function(parameter_list)) [dimension] <br>//Type表示返回的数组指针指向的数组元素类型 <br>//dimension表示数组的大小 <br>//例如: <br>int (*func(int i)) [10]; <br>
使用尾置返回类型(C++11)
<br>auto func(int i) -> int(*)[10]; <br>
使用decltype
<br>int odd[] = {1,3,5,7,9}; <br>int even[] = {0,2,4,6,8}; <br>decltype(odd) *arrPtr(int i) <br>{ <br> return (i % 2) ? &odd : &even; //返回一个指向数组的指针 <br>} <br>
函数重载
如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overloaded)函数。
不允许两个函数除了返回类型外其他所有要素都相同。
重载与作用域:一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体。
特殊用途语言特性
介绍三种函数相关的语言特性:默认实参、内联函数、constexpr函数。
默认实参
调用包含默认实参的函数时,可以包含该实参,也可以省略该实参。
一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。
内联函数(inline)
调用函数一般比求等价表达式的值要慢,内联函数可避免函数调用的开销。
- 将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。
constexpr函数
函数的返回类型和所有的形参类型都得是字面值类型。
函数中必须有且只有一条return语句。
constexpr函数被隐式地指定为内联函数。
内联函数和constexpr函数通常定义在头文件中
调试帮助
程序可以包含一些用于调试的代码,但这些代码只在开发程序时使用。当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。
assert预处理宏
#include <cassert>assert(expr);//首先对expr求值,//如果表达式为假(即0),assert输出信息并终止程序的执行。//如果表达式为真(即非0),assert什么也不做。//例如:对一个文本进行操作的程序可能要求所给定单词的长度都大于某个阈值。assert(word.size() > threshold;
NDEBUG预处理变量
assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时assert将运行执行时检查。
使用#define语句定义NDEBUG,从而关闭调试状态。
很多编译器都提供了命令行选项使我们可以定义预处理变量。
<br>$ CC -D NDEBUG main.C #微软编译器中用 /D <br>
这只是调试程序的辅助手段,不能代替真正的逻辑检查,也不能代替程序本应该包含的错误检查。
除了assert以外,也能使用NDEBUG编写自己的条件调试代码:
//如果定义了NDEBUG,#ifndef和#endif之间的代码将被忽略void print(const int ia[], aize_t size) { #ifndef NDEBUG //_ _func_ _是编译器定义的一个局部静态变量,用于存放函数的名字,它是const char的一个静态数组。 cerr << _ _func_ _ << "array size is " << size << endl; #endif}
除了_ _ func _ _之外,还有其它四个名字:
_ _FILE_ _ 存放文件名的字符串字面值 _ _LINE_ _ 存放当前行号的整型字面值 _ _TIME_ _ 存放文件编译时间的字符串字面值 _ _DATA_ _ 存放文件编译日期的字符串字面值
函数指针
bool lengthCompare(const string &, const string &);//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型。注意圆括号必不可少bool (*pf) (const string &, const string &); //未初始化
当我们把函数名作为值使用时,该函数自动地转换成指针
pf = lengthCompare; //pf指向名为lengthCompare的函数pf = &lengthCompare; //等价赋值语句,&是可选的
调用该函数:
//此三个调用等价bool b1 = pf("hello", "goodbye");bool b2 = (*pf)("hello", "goodbye");bool b3 = lengthCompare("hello", "goodbye");
参考:C++Primer第五版
相关文章:
以上是第六章C++:函數基礎與應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

要開始C#.NET開發,你需要:1.了解C#的基礎知識和.NET框架的核心概念;2.掌握變量、數據類型、控制結構、函數和類的基本概念;3.學習C#的高級特性,如LINQ和異步編程;4.熟悉常見錯誤的調試技巧和性能優化方法。通過這些步驟,你可以逐步深入C#.NET的世界,並編寫高效的應用程序。

C#和.NET的關係是密不可分的,但它們不是一回事。 C#是一門編程語言,而.NET是一個開發平台。 C#用於編寫代碼,編譯成.NET的中間語言(IL),由.NET運行時(CLR)執行。

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具