C++函数签名
函数签名的组成部分
-
函数名称
函数的名字(如calculate
、print
)。 -
参数列表(Parameter List)
-
参数的类型、顺序和数量。
-
参数的名字 不影响 签名(如
int func(int a)
和int func(int b)
是同一签名)。
-
-
所属的类或命名空间
-
成员函数属于特定类(如
MyClass::method
)。 -
自由函数属于全局或某个命名空间。
-
-
成员函数的
const
/volatile
限定
例如:void MyClass::method() const
和void MyClass::method()
是不同签名。 -
noexcept
说明符(C++11起)
如void func() noexcept
和void func()
是不同签名。 -
引用限定符(C++11起)
如void func() &
(左值引用限定)和void func() &&
(右值引用限定)是不同签名。
不包含在函数签名中的内容
-
返回类型
例如:int func()
和double func()
无法共存(编译器报错)。 -
默认参数
默认参数的值不影响签名,但影响函数调用时的行为。 -
异常规范(C++17 前)
如throw()
(C++17 后弃用,改用noexcept
)。
函数签名的作用
函数签名的重要性体现在函数重载和模板实例化中。在函数重载时,编译器使用函数签名来判断哪一个函数被调用;在模板实例化时,函数签名帮助确定具体实例化哪一个模板。
函数签名的作用
-
函数重载(Overloading)
通过不同签名区分同名函数:int add(int a, int b); // 签名: add(int, int) double add(double a, double b); // 签名: add(double, double)
-
模板特化
函数模板的特化依赖签名匹配:template<typename T> void func(T a); // 主模板 template<> void func<int>(int a); // 特化版本
-
链接与符号生成
编译器根据签名生成唯一符号(如_Z3addii
对应add(int, int)
)。