首頁 > 軟體

C++深入分析回顧函數過載

2022-06-01 14:06:04

一、函數過載回顧

  • 函數過載的本質為相互獨立的不同函數
  • C++ 中通過函數名和函數引數確定函數呼叫
  • 無法直接通過函數名得到過載函數的入口地址
  • 函數過載必然發生在同一個作用域中

二、類中的過載

類中的成員函數可以進行過載

  • 建構函式的過載
  • 普通成員函數的過載
  • 靜態成員函數的過載

問題:全域性函數,普通成員函數以及靜態成員函數之間是否可以構成過載?

注意事項

  • 過載函數的本質為多個不同的函數
  • 函數名和參數列是唯一的標識
  • 函數過載必須發生在同一個作用域中

所以類的成員函數和全域性函數不能構成過載,因為全域性函數位於全域性的名稱空間當中,而成員函數位於類裡面,作用域不一樣。

下面看一個過載的範例:

#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 = %dn", i);
    }
    int getI()
    {
        return i;
    }
};
void func()
{
    printf("void func()n");
}
void func(int i)
{
    printf("void func(int i), i = %dn", i);
}
int main()
{
    func();
    func(1);
    Test t;        // 初始化,呼叫沒有引數的建構函式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;
}

輸出結果如下:

這個例子展示了類中函數的過載以及全域性函數的過載,值得多閱讀幾遍!!

三、過載的意義

  • 通過函數名對函數功能進行提示
  • 通過參數列對函數用法進行提示
  • 擴充套件系統中已經存在的函數功能

下面看一個字串拷貝函數的過載:

#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("%sn", buf);
    return 0;
}

輸出結果如下:

四、小結

  • 類的成員函數之間可以進行過載
  • 過載必須發生在同一個作用域中
  • 全域性函數和成員函數不能構成過載關係
  • 過載的意義在於擴充套件已經存在的功能

到此這篇關於C++深入分析回顧函數過載的文章就介紹到這了,更多相關C++函數過載內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com