<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
自然語言中,一個詞可以有多重含義,人們可以通過上下文來判斷該詞真實的含義,即該詞被過載了。
比如:以前有一個笑話,國有兩個體育專案大家根本不用看,也不用擔心。一個是乒乓球,一個是男足。前者是“誰也贏不了!”,後者是“誰也贏不了!”
函數過載:
//C語言不支援過載,C++支援過載 int Add(int left, int right) { return left+right; } double Add(double left, double right) { return left+right; } int Add(int left, double right) { return left+right; } int Add(double left, int right) { return left+right; } int main() { Add(10, 20); Add(10.0, 20.0); Add(10, 20.0); Add(10.0, 20.0) return 0; }
下面兩個函數屬於函數過載嗎?
short Add(short left, short right) { return left+right; } int Add(short left, short right) { return left+right; } int main() { Add(10, 20); Add(10, 20); return 0; }
程式碼解析:
意義:
在C語言中,想要定義多個不同型別交換資料的子函數,需要不同的函數名來命名,比如SweapA、SweapB…等等
void SweapA(int *pa, int *pb) { int temp = *pa; *pa = *pb; *pb = temp; } void SweapB(double *pa, double *pb) { double temp = *pa; *pa = *pb; *pb = temp; } int main() { int a = 10, b = 20; double c = 10.0, d = 20.0; SweapA(&a, &b); SweapB(&c), &d); return 0; }
void Sweap(int *pa, int *pb) { int temp = *pa; *pa = *pb; *pb = temp; } void Sweap(double *pa, double *pb) { double temp = *pa; *pa = *pb; *pb = temp; } int main() { int a = 10, b = 20; double c = 10.0, d = 20.0; Sweap(&a, &b); Sweap(&c), &d); return 0; }
名字修飾(name Mangling):
為什麼C++支援過載,而C語言不支援呢?
在Linux下使用gcc和g++編譯器演示函數名被修飾後的名字
採用C語言編譯器編譯後結果(反組合)
結論:在Linux下,採用gcc編譯完成後,函數名字的修飾沒有發生改變
採用C++編譯器編譯後結果(反組合)
結論:在Linux下,採用g++編譯完成後,函數名字的修飾發生改變,編譯器將函數引數型別資訊新增到修改後的名字中
總結
gcc的函數修飾後名字不變。而g++的函數修飾後變成(_Z+函數長度+函數名+型別首字母)
C語言沒辦法支援過載,因為同名函數沒辦法區分。而C++是通過函數修飾規則來區分,只要引數不同,修飾出來的名字就不一樣,就支援了過載
Windows下名字修飾規則
結論:對比Linux會發現,windows下C++編譯器對函數名字修飾非常奇怪,但道理都是一樣的
擴充套件學習:C/C++函數呼叫約定和名字修飾規則
接下來,再演示一個例子
f.h
#include <stdio.h>void f(int a, double b);
void f(double b, int a);f.cpp
#include "f.h"void f(int a, double b);
{
printf("%d %lfn", a, b)
}void f(double b, int a);
{
printf("%lf %dn", b, a)
}
Test.cpp
#include "f.h"int main()
{
f(1, 2.222);
f(2.222, 1);
return 0;
}
編譯後,生成組合指令;連結時,生成符號表
Linux下g++(C++)編譯器的命名:
Linux下gcc(C)編譯器的命名:
那麼CPP是怎麼呼叫C中的靜態/動態庫呢?(vs2022演示)
首先,我們用C來生成一個靜態庫或動態庫
Test.h #include <stdio.h> void PrintArray(int* p, int n); //顯示陣列內容 void InsertSort(int* p, int n); //插入排序 Test.C #include "Test.h" void InsertSort(int* p, int n) { for (int i = 0; i < n - 1; ++i) { int end = i; int tmp = p[end + 1]; while (end >= 0) { if (tmp < p[end]) { p[end + 1] = p[end]; --end; } else { break; } } p[end + 1] = tmp; } }
設定型別改成靜態庫後,生成解決方案,就得到字尾.lib檔案了
在CPP專案中新增新的庫目錄(這個庫是你生成的靜態庫的路徑)
增加新的依賴項(依賴項為生成靜態庫的檔名+字尾"Test.lib")
做完這些準備後,我們來進行編譯程式
extern "C" { //"../"是在當前目錄的上一個目錄中找檔案 #include "../../Test/Test/Test.h" } #include <iostream> using namespace std; void TestInsertSort() { int Array[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; InsertSort(Array, sizeof(Array) / sizeof(Array[0])); for (int i = 0; i < 10; ++i) cout << Array[i] << " "; cout << " " << endl; } int main() { TestInsertSort(); return 0; }
如果C想呼叫CPP的靜態或動態庫呢?
Test.h #include <stdio.h> #ifdef __cplusplus #define EXTERN_C extern "C" #else #define EXTERN_C #endif EXTERN_C void PrintArray(int* p, int n); EXTERN_C void InsertSort(int* p, int n); Test.cpp #include "Test.h" void PrintArray(int* p, int n) { for (int i = 0; i < n; ++i) { printf("%d ", p[i]); } printf("n"); } void InsertSort(int* p, int n) { for (int i = 0; i < n - 1; ++i) { int end = i; int tmp = p[end + 1]; while (end >= 0) { if (tmp < p[end]) { p[end + 1] = p[end]; --end; } else { break; } } p[end + 1] = tmp; } }
感謝大家支援!!!
到此這篇關於C++深入淺出講解函數過載的文章就介紹到這了,更多相關C++函數過載內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45