02-函式過載

東閣堂主發表於2019-02-01

寫在前面

作為移動端的開發語言,新秀們是支援運算子過載的,老一輩語言是不支援的。先透漏一點。
/*
 C語言不支援運算子過載
 java中確實沒有云運算子過載,唯一例外是String裡面的=和+ String類的"=","+","+=",看似運算子過載,實際不是,只是在java編譯器裡做了一點手腳
 OC語言不支援運算子過載
 
 swift 支援運算子過載
 kotlin 支援運算子過載
 C++  支援運算子過載 ?
 */
複製程式碼

名詞解釋

◼規則
函式名相同 引數個數不同、引數型別不同、引數順序不同
◼注意
返回值型別與函式過載無關 呼叫函式時,實參的隱式型別轉換可能會產生二義性
◼本質
採用了name mangling或者叫name decoration技術
✓ C++編譯器預設會對符號名(變數名、函式名等)進行改編、修飾,有些地方翻譯為“命名傾軋” ✓ 過載時會生成多個不同的函式名,不同編譯器(MSVC、g++)有不同的生成規則
複製程式碼

上程式碼

將main.m 改為mian.mm 檔案
C++ 如何定義函式
void hehehe() {
    cout << "hehehe() " << endl;
}
上面定義了名稱為hehehe的函式,函式體就是列印一下函式名,看著後面部分和swift一樣,
(不好意思,暴露了能力--?,我寫了兩年多的swift了--從2.0就入坑了)
對就是這麼簡單與隨意。
看下完整的程式碼
#include <iostream>
using namespace std;

// hehehe_v
void hehehe() {
    cout << "hehehe() " << endl;
}

// hehehe_i
void hehehe(int a) {
    cout << "hehehe(int a) " << a << endl;
}

// hehehe_l
void hehehe(long a) {
    cout << "hehehe(long a) " << a << endl;
}

// hehehe_d
void hehehe(double a) {
    cout << "hehehe(double a) " << a << endl;
}

// main
int main() {
    hehehe();
    hehehe(10);
    hehehe(10l);
    hehehe(10.1);
}
看看列印結果:
hehehe() 
hehehe(int a) 10
hehehe(long a) 10
hehehe(double a) 10.1
嗯嗯,沒問題,似乎如喝到了小時的冰水,這感覺爽爽的。
複製程式碼

完整程式碼demo,請移步GitHub:DDGLearningCpp

當然C++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?

相關文章