文章目錄
-
- 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