10. 函數(shù)3

內(nèi)聯(lián)函數(shù)

  1. 在編譯代碼的時(shí)候,與其他程序代碼聯(lián)起來(lái),編譯器使用相應(yīng)的函數(shù)代碼來(lái)替換函數(shù)調(diào)用

  2. 內(nèi)聯(lián)函數(shù)運(yùn)行速度比常規(guī)函數(shù)稍快,但是需要更多的內(nèi)存

  3. 如果要使用內(nèi)聯(lián)函數(shù),需要采取的措施是:在函數(shù)聲明前加上inline關(guān)鍵字,或在函數(shù)定義前加上inline關(guān)鍵字

  4. 通常可以省略原型,將整個(gè)函數(shù)的定義放在寫(xiě)原型的地方

  5. 注意:內(nèi)聯(lián)函數(shù)不能遞歸

  6. 例子

    #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;
    }
    

引用變量

  1. 引用變量是指給已經(jīng)定義的變量設(shè)置一個(gè)別名,比如將abc作為變量a的引用,那么可以交替使用a和abc

  2. 創(chuàng)建引用變量

    1. 在cpp中,使用&符號(hào)來(lái)指示變量地址,這個(gè)符號(hào)也可以用來(lái)聲明引用

    2. 例子

      int cat;
      int &mao = cat; // 將mao設(shè)置為cat的別名
      
      • 在這里,&不再是地址運(yùn)算符,而是類型標(biāo)識(shí)符的一部分
    3. 例子:交替使用引用名和變量名

      /*
       * 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值是一樣的,地址也是一樣的
  3. 將引用作為函數(shù)參數(shù)

    1. 按引用傳遞允許被調(diào)用的函數(shù)能夠訪問(wèn)調(diào)用函數(shù)中的變量

    2. 例子:交換兩個(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ù)

  1. 函數(shù)調(diào)用中省略實(shí)參時(shí)自動(dòng)使用的一個(gè)值

  2. 必須通過(guò)函數(shù)原型來(lái)設(shè)置默認(rèn)值,因?yàn)榫幾g器通過(guò)查看原型來(lái)了解函數(shù)所使用的參數(shù)數(shù)量

    char *left(const char *str,int n = 1);
    
  3. 必須從右向左添加默認(rèn)值,有默認(rèn)值的參數(shù)放到最右邊

  4. 例子

    #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ù)重載

  1. 可以有多個(gè)同名的函數(shù),但是參數(shù)列表不同

  2. cpp使用上下文來(lái)確定要使用的重載函數(shù)版本

  3. 函數(shù)重載的關(guān)鍵就是函數(shù)的參數(shù)列表,如果兩個(gè)函數(shù)的參數(shù)數(shù)量和類型相同,參數(shù)的排列順序也相同,那么就稱為函數(shù)特征標(biāo)(function signature)相同

  4. 例子

    #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;
     } 
    
  5. 當(dāng)函數(shù)基本上執(zhí)行相同的任務(wù),但是需要使用 不同形式的數(shù)據(jù)時(shí),可以使用函數(shù)重載

函數(shù)模板

  1. 函數(shù)模板就是通用的函數(shù)描述,即使用泛型來(lái)定義函數(shù)

  2. 泛型可以用具體的類型(比如int或double)來(lái)替換,通過(guò)將類型作為參數(shù)傳遞給模板,可以使得編譯器生成對(duì)應(yīng)類型的函數(shù)

  3. 例子

    // 建立一個(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
  4. 例子:函數(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程序分不清
  5. 可以像重載常規(guī)函數(shù)定義那樣重載模板定義,被重載的模板的函數(shù)特征標(biāo)必須不同

    1. 例子

      #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;
      }
      
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容