[C++] 拓展屬性

來源:互聯網
上載者:User

標籤:規則   相互   namespace   efault   def   概念   end   重載   失敗   

 

inline函數

函數重載

佔位參數和預設參數

 

/*__________________________________________________________________背景:    C++中的const常量可以替代宏常數定義,const int A = 3;  #define A 3            C++中的inline函數可以替代宏程式碼片段內嵌函式由 編譯器處理,直接將編譯後的函數體插入調用的地方宏程式碼片段 由前置處理器處理, 進行簡單的文本替換,沒有任何編譯過程    1)內嵌函式在編譯時間直接將函數體插入函數調用的地方    2)inline只是一種請求,編譯器不一定允許這種請求    3)內嵌函式省去了普通函數調用時壓棧,跳轉和返回的開銷 C++中內聯編譯的限制:    不能存在任何形式的迴圈語句        *    不能存在過多的條件判斷語句        *    函數體不能過於龐大                *    不能對函數進行取址操作            *    函數內聯聲明必須在調用語句之前    *__________________________________________________________________*/#include <iostream>using namespace std;#define MYFUNC(a, b)  ((a) < (b)? (a):(b))inline int myfunc(int a, int b) {    return (a < b? a : b);}int main(void) {    int a = 1, b = 3;        int c = 0;//    c = MYFUNC(1, 3);    c = myfunc(1, 3);        cout << "c:" << c << endl;        return 0;}

 

 

/*———————————————————————————————————— 1 函數重載概念函數重載(Function Overload)    用同一個函數名定義不同的函數    當函數名和不同的參數搭配時函數的含義不同2 函數重載的判斷標準    函數重載至少滿足下面的一個條件:        參數個數不同        參數類型不同        參數順序不同        !!!函數傳回值不是函數重載的判斷標準        3.編譯器調用重載函數的準則    精確匹配實參    通過預設參數能夠匹配實參    通過預設類型轉換匹配實參匹配失敗    最終尋找到的可行候選函數不唯一,則出現二義性,編譯失敗。    無法匹配所有候選者,函數未定義,編譯失敗。4.重載函數在本質上是相互獨立的不同函數(靜態鏈編)        函數重載是由函數名和參數列表決定的。        函數傳回值不能作為函數重載的依據                    重載函數的函數類型是不同的                函數重載是發生在一個類中裡面5.函數重載與函數指標    當使用重載函數名對函數指標進行賦值時    根據重載規則挑選與函數指標參數列表一致的候選者    嚴格匹配候選者的函數類型與函數指標的函數類型————————————————————————————————————*/#include <iostream>#include <cstring>using namespace std;int func(int x)         { return x;         }int func(int a, int b)  { return a + b;     }//當函數的 預設參數 遇上 函數重載 會導致函數二義性,編譯失敗//int func(int a, int b, int c = 0) { return a * b *c; }  int func(const char* s) { return strlen(s); }//函數重載與函數指標typedef int(*PFUNC)(int a); // int(int a)int main(int argc, char* argv[]) {    int c = 0;    c = func(1);    printf("c = %d\n", c);    c = func(1, 2);    printf("c = %d\n", c);    c = func("12345");    printf("c = %d\n", c);        PFUNC p = func;//p是一個函數指標變數    c = p(1);    printf("c = %d\n", c);            return 0;} 

 

 

 

/*____________________________________________________________________________________C++中可以在函式宣告時為參數提供一個預設值,    當函數調用時沒有指定這個參數的值,編譯器會自動用預設值代替函數預設參數的規則    一旦在一個函數調用中開始使用預設參數值,那麼這個參數後的所有參數都必須使用預設參數值    預設聲明後不得再次嘗試聲明來試圖更改預設值    函數佔位參數      佔位參數只有參數型別宣告,而沒有參數名聲明    一般情況下,在函數體內部無法使用佔位參數可以將佔位參數與預設參數結合起來使用    意義        為以後程式的擴充留下線索          相容C語言程式中可能出現的不規範寫法    ____________________________________________________________________________________*/#include <iostream> using namespace std;void printfAB(int x = 3) {    printf("x:%d\n", x);} //在預設參數規則, 如果預設參數出現,那麼右邊的都必須有預設參數void printABC(int a, int b, int x = 3, int y = 4, int z = 5) {    printf("x:%d\n", x);}int func(int a, int b, int )  {//佔位參數 placeholder para     return a + b;}/*===================    結合    ===================*/int Place_default(int a, int b, int = 0) {    return a + b;}int main(int argc, char* argv[]) {    printfAB(2);    printfAB();        printf("func(1, 2, 3) = %d\n", func(1, 2, 3));//不可以 func(1, 2);         int c1 = 0, c2 = 0;    c1 = Place_default(1, 2); //ok    c2 = Place_default(1, 2, 3);//ok    cout << "c1:" << c1 << endl;    cout << "c2:" << c2 << endl;        return 0;}

 

[C++] 拓展屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.