天天看點

【C++深度解析】19、類中函數重載

文章目錄

    • 1 重載回顧
    • 2 成員函數重載
    • 3 重載的意義
    • 4 小結

前面我們已經學習了函數重載,現在來回顧一下:

  • C++通過函數名和函數參數确定函數調用,本質為互相獨立的不同函數
  • 無法通過函數名得到重載函數的入口位址
  • 函數重載必然發生在同一作用域中

類中的成員函數也可以進行重載,萬變不離其宗

  • 重載函數的本質為多個不同的函數
  • 函數名和參數清單是唯一的辨別
  • 函數重載必須發生在統一作用域中
// 19-1.cpp
#include<stdio.h>
class Test
{
public:
    Test()
    {
        printf("Test()::Test()\n");
        this->x = 0;
    }
    Test(int i)
    {
        printf("Test()::Test(int i), i = %d\n", i);
        x = i;
    }
    Test(const Test& t)
    {
        printf("Test()::Test(const Test& t)\n");
        this->x = t.x;
    }
    static void func()
    {
        printf("Test()::func()\n");
    }
    void func(int i)
    {
        printf("Test()::func(int i) : i = %d\n", i);
    }
    void func(int i) const
    {
        printf("Test()::func(int i) const: i = %d\n", i);
    }
private:
    int x;
};
void func()
{
    printf("func()\n");
}
void func(int i)
{
    printf("func(int i) : i = %d\n", i);
}
int main()
{
    func();
    func(1);

    Test t;
    Test t1(1);
    const Test t2(t1);
    t1.func();
    t1.func(1);
    t2.func(1);
    return 0;
}
           

類成員函數 void Test::func(); void Test::func(int i); 和全局函數 void func(); void func(int i); 不在同一作用域,不構成函數重載。

成員函數

static void func();

void func(int i);

void func(int i) const;

三者之間構成重載,const 對象隻能調用 const 成員函數。

$ g++ 19-1.cpp -o 19-1
$ ./19-1
func()
func(int i) : i = 1
Test()::Test()
Test()::Test(int i), i = 1
Test()::Test(const Test& t)
Test()::func()
Test()::func(int i) : i = 1
Test()::func(int i) const: i = 1
           

利用重載,我們可以擴充系統中已經存在的函數功能。

// 19-2.cpp
#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 = "Hello World!";
    char buf[5] = { 0 };
    strcpy(buf, s, sizeof(buf)-1);
    printf("%s\n", buf);
    return 0;
}
           
$ g++ 19-2.cpp -o 19-2
$ ./19-2
Hell
           

繼續閱讀