C++深入分析回顧函數(shù)重載
一、函數(shù)重載回顧
- 函數(shù)重載的本質(zhì)為相互獨(dú)立的不同函數(shù)
- C++ 中通過函數(shù)名和函數(shù)參數(shù)確定函數(shù)調(diào)用
- 無法直接通過函數(shù)名得到重載函數(shù)的入口地址
- 函數(shù)重載必然發(fā)生在同一個(gè)作用域中
二、類中的重載
類中的成員函數(shù)可以進(jìn)行重載
- 構(gòu)造函數(shù)的重載
- 普通成員函數(shù)的重載
- 靜態(tài)成員函數(shù)的重載
問題:全局函數(shù),普通成員函數(shù)以及靜態(tài)成員函數(shù)之間是否可以構(gòu)成重載?
注意事項(xiàng)
- 重載函數(shù)的本質(zhì)為多個(gè)不同的函數(shù)
- 函數(shù)名和參數(shù)列表是唯一的標(biāo)識(shí)
- 函數(shù)重載必須發(fā)生在同一個(gè)作用域中
所以類的成員函數(shù)和全局函數(shù)不能構(gòu)成重載,因?yàn)槿趾瘮?shù)位于全局的命名空間當(dāng)中,而成員函數(shù)位于類里面,作用域不一樣。
下面看一個(gè)重載的示例:
#include <stdio.h> class Test { int i; public: Test() { printf("Test::Test()\n"); this->i = 0; } Test(int i) { printf("Test::Test(int i)\n"); this->i = i; } Test(const Test& obj) { printf("Test(const Test& obj)\n"); this->i = obj.i; } static void func() { printf("void Test::func()\n"); } void func(int i) { printf("void Test::func(int i), i = %d\n", i); } int getI() { return i; } }; void func() { printf("void func()\n"); } void func(int i) { printf("void func(int i), i = %d\n", i); } int main() { func(); func(1); Test t; // 初始化,調(diào)用沒有參數(shù)的構(gòu)造函數(shù)Test(),輸出Test::Test() Test t1(1); // Test::Test(int i) Test t2(t1); // Test(const Test& obj) func(); // void func() Test::func(); // void Test::func() func(2); // void func(int i), i = 2; t1.func(2); // void Test::func(int i), i = 2 t1.func(); // void Test::func() return 0; }
輸出結(jié)果如下:
這個(gè)例子展示了類中函數(shù)的重載以及全局函數(shù)的重載,值得多閱讀幾遍??!
三、重載的意義
- 通過函數(shù)名對函數(shù)功能進(jìn)行提示
- 通過參數(shù)列表對函數(shù)用法進(jìn)行提示
- 擴(kuò)展系統(tǒng)中已經(jīng)存在的函數(shù)功能
下面看一個(gè)字符串拷貝函數(shù)的重載:
#include <stdio.h> #include <string.h> char* strcpy(char* buf, const char* str, unsigned int n) { return strncpy(buf, str, n); } int main() { const char* s = "AutumnZe"; char buf[8] = {0}; //strcpy(buf, s); strcpy(buf, s, sizeof(buf)-1); printf("%s\n", buf); return 0; }
輸出結(jié)果如下:
四、小結(jié)
- 類的成員函數(shù)之間可以進(jìn)行重載
- 重載必須發(fā)生在同一個(gè)作用域中
- 全局函數(shù)和成員函數(shù)不能構(gòu)成重載關(guān)系
- 重載的意義在于擴(kuò)展已經(jīng)存在的功能
到此這篇關(guān)于C++深入分析回顧函數(shù)重載的文章就介紹到這了,更多相關(guān)C++函數(shù)重載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)班車管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)班車管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)飛機(jī)訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12詳解C++ 多態(tài)的實(shí)現(xiàn)及原理
這篇文章主要介紹了C++ 多態(tài)的實(shí)現(xiàn)及原理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05C++深入詳解單例模式與特殊類設(shè)計(jì)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++單例模式和特殊類的設(shè)計(jì),單例模式這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-06-06C++?STL之string的模擬實(shí)現(xiàn)實(shí)例代碼
C++中有命名空間的存在,我們只需把我們的代碼封到自定義的命名空間即可,下面這篇文章主要給大家介紹了關(guān)于C++?STL之string的模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-01-01C語言數(shù)據(jù)結(jié)構(gòu)二叉樹之堆的實(shí)現(xiàn)和堆排序詳解
堆是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱,通常是一個(gè)可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將詳細(xì)介紹堆的實(shí)現(xiàn)和堆排序,需要的可以參考一下2022-04-04