內(nèi)聯(lián)函數(shù)
在編譯代碼的時(shí)候,與其他程序代碼聯(lián)起來(lái),編譯器使用相應(yīng)的函數(shù)代碼來(lái)替換函數(shù)調(diào)用
內(nèi)聯(lián)函數(shù)運(yùn)行速度比常規(guī)函數(shù)稍快,但是需要更多的內(nèi)存
如果要使用內(nèi)聯(lián)函數(shù),需要采取的措施是:在函數(shù)聲明前加上inline關(guān)鍵字,或在函數(shù)定義前加上inline關(guān)鍵字
通常可以省略原型,將整個(gè)函數(shù)的定義放在寫(xiě)原型的地方
注意:內(nèi)聯(lián)函數(shù)不能遞歸
-
例子
#include <iostream> // 定義內(nèi)聯(lián)函數(shù) inline double square(double x){ return x*x; } int main(){ using namespace std; double a,b; double c = 2.0; a = square(5.0); b = square(4.3+5.7); cout << "a的值是:" << a<< endl; cout << "b的值是:" << b<< endl; cout << "c平方之后的值是:" << square(c)<< endl; }
引用變量
引用變量是指給已經(jīng)定義的變量設(shè)置一個(gè)別名,比如將abc作為變量a的引用,那么可以交替使用a和abc
-
創(chuàng)建引用變量
在cpp中,使用&符號(hào)來(lái)指示變量地址,這個(gè)符號(hào)也可以用來(lái)聲明引用
-
例子
int cat; int &mao = cat; // 將mao設(shè)置為cat的別名- 在這里,&不再是地址運(yùn)算符,而是類型標(biāo)識(shí)符的一部分
-
例子:交替使用引用名和變量名
/* * firstref.cpp * * Created on: 2022年3月28日 * Author: mayuj */ #include <iostream> int main() { using namespace std; int cat; cat = 101; int &mao = cat; cout << "cat等于:" << cat << endl; cout << "mao等于:" << mao << endl; mao++; cout << "cat等于:" << cat << endl; cout << "mao等于:" << mao << endl; cout << "cat內(nèi)存地址:"<< &cat << endl; cout << "mao內(nèi)存地址:"<< &mao << endl; return 0; }- 可以看出mao和cat值是一樣的,地址也是一樣的
-
將引用作為函數(shù)參數(shù)
按引用傳遞允許被調(diào)用的函數(shù)能夠訪問(wèn)調(diào)用函數(shù)中的變量
-
例子:交換兩個(gè)值的函數(shù)
#include <iostream> void swap_alias(int &a,int &b); // a和b是int的別名 void swap_address(int *p,int *q); // p和q是int的地址 void swap_variable(int a,int b); // a和b是單純的變量 int main() { using namespace std; int alias1 = 300; int alias2 = 355; cout << "原始alias1的值是:" << alias1 << endl; cout << "原始alias2的值是:" << alias2 << endl; cout << "使用傳遞別名的函數(shù)交換alias1和alias2"<< endl; swap_alias(alias1,alias2); cout << "別名交換之后,alias1的值是" << alias1 << endl; cout << "別名交換之后,alias2的值是" << alias2 << endl; cout << endl; int address1 = 100; int address2 = 200; cout << "原始address1的值是:" << address1 << endl; cout << "原始address2的值是:" << address2 << endl; cout << "使用傳遞地址的函數(shù)交換address1和address2"<< endl; swap_address(&address1,&address2); cout << "別名交換之后,address1的值是" << address1 << endl; cout << "別名交換之后,address2的值是" << address2 << endl; cout << endl; int v1 = 150; int v2 = 333; cout << "原始v1的值是:" << v1 << endl; cout << "原始v2的值是:" << v2 << endl; cout << "使用傳遞變量的函數(shù)交換v1和v2"<< endl; swap_variable(v1,v2); cout << "變量交換之后,v1的值是" << v1 << endl; cout << "變量交換之后,v2的值是" << v2 << endl; return 0; } void swap_alias(int &a,int &b){ // a和b是alias1和alias2的別名,交換a和b就相當(dāng)于交換了alias1和alias2的值 int temp; temp = a; a = b; b = temp; } void swap_address(int *p,int *q){ // 此處的p是一個(gè)int指針,所以p對(duì)應(yīng)的參數(shù)是地址 int temp; temp = *p; *p = *q; *q = temp; } void swap_variable(int a,int b){ // 在這里,a和b是復(fù)制了v1和v2的值的新變量,所以它們交換之后不會(huì)影響原來(lái)的值 int temp; temp = a; a = b; b = temp; }- 可以看到,按值傳遞的方法沒(méi)有交換兩個(gè)變量的值
默認(rèn)參數(shù)
函數(shù)調(diào)用中省略實(shí)參時(shí)自動(dòng)使用的一個(gè)值
-
必須通過(guò)函數(shù)原型來(lái)設(shè)置默認(rèn)值,因?yàn)榫幾g器通過(guò)查看原型來(lái)了解函數(shù)所使用的參數(shù)數(shù)量
char *left(const char *str,int n = 1); 必須從右向左添加默認(rèn)值,有默認(rèn)值的參數(shù)放到最右邊
-
例子
#include <iostream> const int SIZE = 80; char *left(const char *str,int n = 1); int main() { using namespace std; char sample[SIZE]; cout << "輸入一個(gè)字符串:"; cin.get(sample,SIZE); char *ps = left(sample,4); cout << "ps的值是:" <<ps << endl; delete [] ps; ps = left(sample); cout << "新ps的值是" << ps << endl; delete [] ps; return 0; } char *left(const char *str,int n){ // 在定義函數(shù)的時(shí)候不寫(xiě)默認(rèn)值 // 這個(gè)函數(shù)返回一個(gè)指向新字符串的指針 if (n <0){ n = 0; } char *p = new char[n+1]; int i; for(i =0;i<n&&str[i];i++){ p[i] = str[i]; } while (i<=n){ p[i++] = '\0'; } return p; }
函數(shù)重載
可以有多個(gè)同名的函數(shù),但是參數(shù)列表不同
cpp使用上下文來(lái)確定要使用的重載函數(shù)版本
函數(shù)重載的關(guān)鍵就是函數(shù)的參數(shù)列表,如果兩個(gè)函數(shù)的參數(shù)數(shù)量和類型相同,參數(shù)的排列順序也相同,那么就稱為函數(shù)特征標(biāo)(function signature)相同
-
例子
#include <iostream> unsigned long left(unsigned long num,unsigned ct); char *left(const char *str,int n =1); int main() { using namespace std; char * trip = "abcdefgh"; unsigned long n = 123456789; int i; char *temp; for (i = 1; i< 10; i++) { cout << left(n,i) << endl; temp = left(trip,i); cout << temp << endl; delete [] temp; } return 0; } // 這個(gè)函數(shù)返回num的前ct位 unsigned long left(unsigned long num,unsigned ct) { unsigned digits = 1; unsigned long n = num; if (ct = 0 || num==0) return 0; while (n/=10) digits++; if (digits > ct) { ct = digits - ct; while (ct--) num /=10; return num; } else return num; } // 這個(gè)函數(shù)返回一個(gè)指向新string的指針 char *left(const char *str,int n) { if(n<0){ n = 0; } char *p = new char[n+1]; int i; for(i=0;i< n&&str[i];i++){ p[i] = str[i]; } while (i<=n){ p[i++] = '\0'; } return p; } 當(dāng)函數(shù)基本上執(zhí)行相同的任務(wù),但是需要使用 不同形式的數(shù)據(jù)時(shí),可以使用函數(shù)重載
函數(shù)模板
函數(shù)模板就是通用的函數(shù)描述,即使用泛型來(lái)定義函數(shù)
泛型可以用具體的類型(比如int或double)來(lái)替換,通過(guò)將類型作為參數(shù)傳遞給模板,可以使得編譯器生成對(duì)應(yīng)類型的函數(shù)
-
例子
// 建立一個(gè)模板,將類型命名為AnyType,類型名可以是任意的,這里寫(xiě)的是AnyType template <typename AnyType> // 下面的方法描述了交換兩個(gè)AnyType值的算法 void swap(AnyType &a,AnyType &b){ AnyType temp; temp = a; a = b; b = temp; }- 模板并不創(chuàng)建任何函數(shù),只是告訴編譯器如何定義 函數(shù)
- 在上述例子中,如果需要交換int類型,那么編譯器就按模板模式創(chuàng)建相應(yīng)的函數(shù),然后用int替換掉AnyType
-
例子:函數(shù)模板例子
#include <iostream> template <typename T> void exchange(T &a,T &b); int main() { using namespace std; int i = 10; int j = 20; cout << "原始的i是:" << i<< endl; cout << "原始的j是:" << j<< endl; exchange(i,j); cout << "交換后的i是:" << i<< endl; cout << "交換后的j是:" << j<< endl; double x = 2.45; double y = 5.23; cout << "原始的x是:" << x << endl; cout << "原始的y是:" << y << endl; exchange(x,y); cout << "交換后的x是:" << x << endl; cout << "交換后的y是:" << y << endl; return 0; } template <typename T> void exchange(T &a,T &b) { T temp; temp = a; a = b; b = temp; }- 注意:cpp中有個(gè)函數(shù)叫swap,如果這里寫(xiě)swap,cpp程序分不清
-
可以像重載常規(guī)函數(shù)定義那樣重載模板定義,被重載的模板的函數(shù)特征標(biāo)必須不同
-
例子
#include <iostream> // 原始的模板 template <typename T> void exchange(T &a,T &b); // 新的模板 template <typename T> void exchange(T *a,T *b, int n); void Show(int a[]); const int LIM = 5; int main() { using namespace std; int i = 10; int j = 20; cout << "原始的i是:" << i<< endl; cout << "原始的j是:" << j<< endl; exchange(i,j); cout << "交換后的i是:" << i<< endl; cout << "交換后的j是:" << j<< endl; int arr1[LIM] = {0,1,2,3,4}; int arr2[LIM] = {5,6,7,8,9}; cout << "原始數(shù)組:\n"; Show(arr1); Show(arr2); exchange(arr1,arr2,LIM); cout << "交換之后的數(shù)組:\n"; Show(arr1); Show(arr2); return 0; } template <typename T> void exchange(T &a,T &b){ T temp; temp = a; a = b; b = temp; } template <typename T> void exchange(T a[],T b[],int n){ T temp; for (int i=0;i<n;i++){ temp = a[i]; a[i] = b[i]; b[i] = temp; } } void Show(int a[]){ using namespace std; cout << a[0] << a[1] <<"/"; cout << a[2] << a[3] << "/"; for (int i=4;i < LIM ;i++){ cout <<a[i]; } cout << endl; }
-