一、前言
C++相比C是支持函数重载的,现在我们详细探讨一下C++函数重载与类方法承载。
二、案例代码
我们编译如下代码,同样的我们关闭代码优化,删除符号链接文(.pdb)
#include "windows.h"
#include "windef.h"
#include <iostream>
#include <tchar.h>
using namespace std;
int LoadFile(const char* filename) {
printf("%s", filename);
return 1;
}
int LoadFile(char* filename,int mod) {
if (mod == 1) {
printf("%s", filename);
return 1;
}
return 2;
}
int _tmain() {
char filename[] = "C:\\\\windows\\x86\\myfile\n";
char* pfilename = filename;
const char constfilename[] = "C:\\\\windows\\x86\\myfile\n";
const char* pconstfilename = "C:\\\\windows\\x86\\myfile\n";
LoadFile(constfilename);
LoadFile("C:\\\\windows\\x86\\myfile\n");
LoadFile(filename,1);
return 0;
}
三、const char* ,char*,const char[],char[]汇编代码上的区别
我们注意上述代码的细节:
第一个函数我们使用静态数组传参。
第二个我们使用定值传参。
第三个我们使用数组传参。
顺便探讨一下静态数组和数组的底层区别。
我们发现实际上const char[] 和char[]在汇编上实际没有区别,const仅仅在编译的时候对类型进行检查。
const char constfilename[]相比const char* pconstfilename,前者不仅仅用到了.rdata的内容,还需要占据相同大小的堆栈空间,而后者仅仅占用一个指针的堆栈空间,所有他们之间还是有区别的。
四、重载函数区别
函数调用详解,从第三个与前两个对比可以看到C++直接将其处理为了两个不同的函数。
我们放回符号链接文件再次查看,显然被处理(修饰)为了不同的函数,具体修饰规则懒得看了,有需要再说。