今天进行了新的学习。
目录
1.什么是函数重载?
2.函数重载的规则
代码演示:
分析:
3.为什么C++能进行函数重载
例如:
调用约定:
4.extern关键字
1.什么是函数重载?
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅通过返回类型的不同来重载函数。
2.函数重载的规则
- 函数的参数列表必须不同,包括参数类型、参数个数或参数顺序。
- 返回类型不是重载函数的标准,只有参数列表不同才能构成重载。
- 函数重载不仅可以发生在同一个类中,也可以在不同的类中。
代码演示:
#include <iostream>
using namespace std;
//函数重载示例
void print(int num) {
cout << "整数num=" << num << endl;
}
void print(int num,int n) {
cout << "整数num=" << num ;
cout << " 整数n=" << n << endl;
}
void print(double num) {
cout << "浮点数num=" << num << endl;
}
void print(const char* str) {
cout << "字符串str=" << str << endl;
}
int main() {
print(10); //调用void print(int num)
print(10, 2); //调用void print(int num,int n)
print(10.1); //调用void print(double num)
print("hello"); //调用void print(const char* str)
return 0;
}
分析:
在上面的示例中,通过函数重载,定义了四个具有相同名称的“print”函数,但他们的参数列表分别是“int”,''int int",''double","const char*"。根据调用时的参数类型,编译器会自动进行合适的函数进行调用。
3.为什么C++能进行函数重载
1.C++能够进行函数重载是因为它支持多态性和编译时多态的特性。
2.函数重载的过程中,编译器会对函数名进行一种称为"名称修饰"或"名字粉碎"(Name Mangling)的操作。在C++中,名称修饰的具体规则是由编译器决定的,因此在不同的编译器和平台上,名称修饰的方式可能会有所不同。
例如:
对于以下两个函数的声明:
void foo(int a);
void foo(double a);
编译器可能将他们的名称修饰为:
foo_i // 表示参数为int类型的foo函数
foo_d // 表示参数为double类型的foo函数
这样,在函数调用时,编译器会根据函数参数的类型来选择正确的函数进行调用。
调用约定:
调用约定(calling convention)是指函数在编译和调用过程中所遵循的一组规则,用于确定函数参数的传递方式、堆栈的管理方式以及函数返回值的处理方式。不同的调用约定可以影响函数在内存中的布局和调用过程中的行为。
常见的调用约定有以下几种:
__cdecl:参数从右向左依次压入堆栈,由调用者负责清理堆栈空间。返回值通常通过寄存器传递,如果返回值的大小超过了寄存器的容量,则通过堆栈返回。__cdecl 是 C 和 C++ 默认的调用约定。
__stdcall:参数从右向左依次压入堆栈,由被调用函数负责清理堆栈空间。返回值通过寄存器传递。与 __cdecl 不同,__stdcall 在函数调用过程中会对参数和函数名进行修饰,以确保函数名的唯一性。
__fastcall:部分参数通过寄存器传递,剩余参数从右向左依次压入堆栈,由被调用函数负责清理堆栈空间。返回值通过寄存器传递。__fastcall 通过减少对堆栈的访问来提高函数调用的性能。
__thiscall:用于 C++ 类成员函数的调用约定,将 this 指针作为隐式参数传递给函数。this 指针通常存储在 ECX 寄存器中。
#include <iostream> using namespace std; // 函数使用 __cdecl 调用约定 int __cdecl Add_cdecl(int a, int b) { return a + b; } // 函数使用 __stdcall 调用约定 int __stdcall Add_stdcall(int a, int b) { return a + b; } // 函数使用 __fastcall 调用约定 int __fastcall Add_fastcall(int a, int b) { return a + b; } int main() { int a = 5; int b = 10; // 调用 __cdecl 函数 int result_cdecl = Add_cdecl(a, b); cout << "Result (cdecl): " << result_cdecl << endl; // 调用 __stdcall 函数 int result_stdcall = Add_stdcall(a, b); cout << "Result (stdcall): " << result_stdcall << endl; // 调用 __fastcall 函数 int result_fastcall = Add_fastcall(a, b); cout << "Result (fastcall): " << result_fastcall << endl; return 0; }
4.extern关键字
extern "C" : 函数名以C的方式修饰约定规则;
extern "C++" : 函数名以C++的方式修饰约定规则;