C++類中的函數重載


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,重載的意義在於擴展已經存在的功能;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM