日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 重载机制实现原理

發布時間:2024/10/14 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 重载机制实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018-03-17 創建人:Ruo_Xiao 開發環境:VS2010 郵箱:xclsoftware@163.com

一、什么是函數重載

在同一作用域類,一組函數的函數名相同,參數列表不同(參數個數不同/參數類型不同),返回值可同可不同。

二、作用

  • 解決為了實現同一個功能而命名不同的函數名字的問題;
  • 實現類中可以有不同功能構造函數的問題;
  • 實現操作符重載。
  • 三、實現原理

    編譯器對函數進行重命名。

    四、C的函數命名規則

    1、函數命名規則為:“_” + 函數名
    2、栗子:

    #include<stdio.h> int Add(int a,int b) {return (a+b); } int main() {Add(10,20);return 0; }

    cod文件的結果部分如下:


    上述中,“_Add”為編譯器對函數“Add”的重新命名,故編譯器無法區分相同函數名不同形參的情況下的函數,故不支持函數重載。

    五、C++的全局函數命名規則

    1、命名規則為:“?” + 函數名 + “@@YA” + 形參 + “@Z”。
    2、栗子:

    #include "stdafx.h" #include <iostream> using namespace std; int Add(int a,int b) {return a+b; }float Add(float a,float b) {return a+b; } int main() {return 0; }

    cod文件的結果部分如下:

    ?Add@@YAMMM@Z ?Add@@YAHHH@Z

    六、C++的類函數命名規則

    1、命名規則:“?” + 函數名 + “@” + 類名 + “@@QAE” + 形參 + “@Z”。
    2、栗子:

    #include "stdafx.h" #include <iostream> using namespace std; class MyMath { public:int Add(int i,int t){return (i+t);}double Add(double i,double t){return (i+t);} }; int main() {MyMath M;M.Add(3,4);M.Add(4.3,7.3);return 0; }

    cod文件的結果部分如下:

    ?Add@MyMath@@QAEHHH@Z ?Add@MyMath@@QAENNN@Z

    七、拓展

    1、為什么函數命名規則中只針對了形參類型和個數,對返回值卻沒有要求呢?
    答:因為只有這樣才能將函數的命名規則脫離代碼的上下文。
    栗子:

    int Add(int i,int t) {return (i+t); } double Add(int i,int t) {return (i+t); } int main() {double d = Add(3,2);int r = Add(4,3);return 0; }

    上述代碼報錯:Add 重命名。
    若函數命名包含返回值,則上述代碼中兩個“Add”函數需要根據表達式中的變量類型來判斷調用哪個函數。故,函數命名規則中不能包含函數的返回值。
    2、重寫
    重寫是派生類中虛函數覆蓋基類中對應的虛函數的過程。

    總結

    以上是生活随笔為你收集整理的C++ 重载机制实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。