C++函数重载的原理

示例代码

main.cpp

cpp 复制代码
#include <iostream>

namespace test12 {
    void func(){std::cout << "test123::func()" << std::endl;}
    void func(int x){std::cout << "test123::func(int x)" << std::endl;}
    void func(char x){std::cout << "test123::func(char x)" << std::endl;}
    void func(double x){std::cout << "test123::func(double x)" << std::endl;}
    void func(std::string s){std::cout << "test123::func(std::string s)" << std::endl;}
    void func(int x, char y){std::cout << "test123::func(int x, char y)" << std::endl;}
    void func(char x, int y){std::cout << "test123::func(char x, int y)" << std::endl;}
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

查看符号表

使用g++编译:

bash 复制代码
g++ -c main.cpp

查看符号表:

bash 复制代码
nm main.o

总结

编译器将程序中的变量和函数编译为一个个的符号,存到符号表。

重载函数在编译为符号时,是根据函数名、形参类型进行转化的。

例如:

bash 复制代码
void func(int x){std::cout << "test123::func(int x)" << std::endl;}

000000000000003a T _ZN6test124funcEi

其中test12是namespace,func是函数名,i表示int类型的形参。

c代码不支持重载,是因为符号是由函数名确定的,没有像c++一样使用形参。gcc编译c代码时遇到函数重载无法编译,而g++可以对其编译。