1,本課程最初階段就學習了函數重載,但是那時研究目標僅限於全局函數,到目前 為止我們學習了三種函數:
1,全局函數;
2,普通成員函數;
3,靜態成員函數;
這三種不同類型的函數之間是否可以構成重載,這是本文討論的主要內容;
2,函數重載回顧:
1,函數重載的本質為相互獨立的不同函數;
2,C++ 中通過函數名和函數參數確定參數調用;
3,無法直接通過函數名得到重載函數的入口地址;
1,如果函數被重載,還需要函數的參數信息;
4,函數重載必然發生在同一個作用域中;
3,類中的重載:
1,類中的成員函數可以進行重載:
1,構造函數的重載;
2,普通成員函數的重載;
3,靜態成員函數的重載;
2,全局函數、普通成員函數以及靜態成員函數之間是否可以構成重載?
4,萬變不離其宗:
1,重載函數本質為多個不同的函數;
1,上述三種函數本質不同;
2,函數名和參數列表是唯一的標識;
1,普通成員函數和靜態成員函數之間可以構成重載;
3,函數重載必須發生在同一個作用域中;
1,普通成員函數和靜態成員函數在同一個作用域(不區分內存類別)中;
2,類的成員函數和全局函數不能構成重載,不在同一個作用域中;
5,類與重載全面分析實例分析:
1,main.cpp 文件:
1 #include <stdio.h> 2 3 class Test 4 { 5 int i; 6 public: 7 Test() 8 { 9 printf("Test::Test()\n"); 10 this->i = 0; 11 } 12 13 Test(int i) 14 { 15 printf("Test::Test(int i)\n"); 16 this->i = i; 17 } 18 19 Test(const Test& obj) // 三個構造函數之間也構成了重載,這是拷貝構造函數; 20 { 21 printf("Test(const Test& obj)\n"); 22 this->i = obj.i; 23 } 24 25 static void func() 26 { 27 printf("void Test::func()\n"); 28 } 29 30 void func(int i) // 和上面的靜態成員函數構成重載; 31 { 32 printf("void Test::func(int i), i = %d\n", i); 33 } 34 35 int getI() 36 { 37 return i; 38 } 39 }; 40 41 void func() 42 { 43 printf("void func()\n"); 44 } 45 46 void func(int i) 47 { 48 printf("void func(int i), i = %d\n", i); 49 } 50 51 int main() 52 { 53 func(); 54 func(1); 55 56 Test t; // Test::Test(); 57 Test t1(1); // Test::Test(int i); 58 Test t2(t1); // Test(const Test& obj); 59 60 func(); // void func(); 61 Test::func(); // void Test::func(); 62 63 func(2); // void func(int i), i = 2; 64 t1.func(2); // void Test::func(int i), i = 2; 65 t1.func(); // void Test::func(); 66 67 return 0; 68 }
2,輸出結果:
1 void func() 2 void func(int i), i = 1 3 Test::Test() 4 Test::Test(int i) 5 Test(const Test& obj) 6 void func() 7 void Test::func() 8 void func(int i), i = 2 9 void Test::func(int i), i = 2 10 void Test::func()
6,重載的深度意義:
1,通過函數名對函數功能進行提示;
1,最大的好處;
2,通過參數列表對函數用法進行提示;
1,真正的意義;
2,代碼自注釋;
3,擴展系統中已經存在的函數功能;
1,更高層次的看待函數重載,雖然實質是增加了新的函數;
7,重載的意義分析編程實驗:
1,main.cpp 文件:
1 #include <stdio.h> 2 #include <string.h> 3 4 /* 擴展 strcpy() 函數的功能 */ 5 char* strcpy(char* buf, const char* str, unsigned int n) 6 { 7 return strncpy(buf, str, n); 8 } 9 10 int main() 11 { 12 const char* s = "D.T.Software"; 13 char buf[8] = {0}; 14 15 // strcpy(buf, s); // 這里會造成內存越界; 16 // strncpy(buf, s, sizeof(buf) - 1); // 最多拷貝 n 個字符,這里 C 語言中的解決方案不好,增加了新的函數,但是名字讓人費解; 17 strcpy(buf, s, sizeof(buf)-1); 18 19 printf("%s\n", buf); 20 21 return 0; 22 }
2,輸出結果:
D.T.Soft
3,重載函數 strcpy(buf, str, n) 的意義:
1,通過函數重載擴展了已有的 strcpy(buf, str) 功能,使得它從原來的兩個參數的狀態變成了三個參數,安全性提高了,但是對於開發者而言調用的是同一個函數,並且容易記憶;
8,重載能夠擴展系統中已經存在的函數功能,重載是否也能夠擴展其他更多的功能?
1,可以,操作符重載;
9,下面復數解決方案是否可行?
1,代碼示例:
1 class Comples 2 { 3 public: 4 int a; 5 int b; 6 }; 7 8 int main() 9 { 10 Complex c1 = {1, 2}; 11 Complex c2 = {3, 4}; 12 Complex c3 = c1 + c2; 13 14 return 0; 15 }
2,通過重載擴展 “+” 的功能,使得它能夠對非實數的復數進行加減;
10,小結:
1,類的成員函數之間可以進行重載;
2,重載必須發生在同一個作用域中;
3,全局函數和成員函數不能構成重載關系;
4,重載的意義在於擴展已經存在的功能;