C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28)
函数重载的回顾
函数重载的本质为相互独立的不同函数
C++中通过函数名和函数参数确定函数调用
无法直接通过函数名得到重载函数的入口地址
函数重载必然发生在同一个作用域中
类中的成员函数可以进行重载
- 构造函数的重载
- 普通成员函数的重载
- 静态成员函数的重载
普通成员函数,静态成员函数,它们之间可以构成函数重载。
全局函数,类的成员函数,它们之间不可以构成函数重载。(作用域不同)
类的成员函数之间是可以构成函数重载。
示例程序:
#include <stdio.h>
class Test
{
int i;
public:
//下面三个Test函数,构成函数重载
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 = %d\n", i);
}
int getI()
{
return i;
}
};
//下面的两个func()函数构成函数重载
void func()
{
printf("void func()\n");
}
void func(int i)
{
printf("void func(int i), i = %d\n", i);
}
int main()
{
func(); //void func()
func(1); //void func(int i), i = 1
Test t ; //Test::Test()
Test t1(1); //Test::Test(int i)
Test t2(t1); //Test(const Test& obj) 写法等价于Test t2 = t1
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()
{
//拷贝字符串s到buffer
const char* s = "D.T.Software";
char buf[8] = {0};
//strcpy(buf, s);
//strncpy(buf, s, sizeof(buf)-1);
strcpy(buf, s, sizeof(buf)-1);
printf("%s\n", buf);
return 0;
}
结果如下:
分析:重载能够扩展系统中已经存在的函数功能!从两个参数扩展到三个参数。
小结:
类的成员函数之间可以进行重载
重载必须发生在同一个作用域中
全局函数和成员函数不能构成重载关系,作用域不一样,全局函数位于全局的命名空间,成员函数位于具体的类。
重载的意义在于扩展已经存在的功能