先是简单理解下函数重载的概念:同一域内的同名函数在函数参数类型,参数个数,参数顺序上具有不同,则互为重载。
ps:函数重载不包括函数返回值类型哟.
然后就是揭开一些c++的迷雾:
常成员函数的重载:
class Test{
//成员函数func
void func(){}
//常成员函数func
void func()const;
}
看起来似乎有问题.
但其实void Test::func()const中的限定词const并非是返回值类型限定,而是隐式参数this的限定
将两个成员函数扩展至全局:
void Test::func(Test* this);
void Test::func(const Test* this);
//然后bb一句无关紧要的:this是以右值形式存在的。
==========================================================================================
简单理解下const与重载的关系:
除去上面ps说的类中const成员函数的重载,现在唠唠嗑,关于const参数与重载的关系:
这里遵循const和函数形参的关系
然后顶层的const是会被忽略的,底层的const不会被忽略。
也就是说:
void func(int x);
void func(const x);
//此处的func是重定义的。
void func(int* pa);
void func(int *const pa);
//这里的func也是会被忽略的。
void func(int const * pa);
void func(int * const pa);
//以上两个func是属于函数重载。
==================================深入一下呢===========================================
其实所谓的函数重载实际上是在标识符-函数签名的一对多的关系映射上做文章,然后再标识符这一层实现调用上的统一,但其编译后的入口被真实的函数签名替代。
做个试验:
导出函数定义如下:
//test.cpp
// test.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include"test.h"
#include
void test() {
std::cout << "啦啦啦" << std::endl;
}
void test(int differ) {
std::cout << "巴扎黑!" << std::endl;
}
//test.h
#ifndef TEST_H
#define TEST_H
__declspec(dllexport) void test();
__declspec(dllexport) void test(int);
#endif
然后使用depends工具查看dll的导出符号:
?test@@YAXH@Z ----- void test(int) --\
?test@@YAXXZ ----- void test(void) --/|====test
这样在调用上就实现了test名字的统一。
通过标识符-函数签名的一对多的映射也就实现了函数的重载。
============
然后就是使用.def文件来实现指定名字的导出,反正我是觉得在导出重载函数时是挺蝼的。
//test.def
LIBRARY test
EXPORTS
test1=?test@@YAXH@Z
test2=?test@@YAXXZ
导出效果如下(depends查看符号):
但事实上,最终还是保证了函数签名-函数实体的唯一对应关系,进而能够实现重载。