c++函数重载详解

先是简单理解下函数重载的概念:同一域内的同名函数在函数参数类型,参数个数,参数顺序上具有不同,则互为重载。  

    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<iostream>
		
		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查看符号):

但事实上,最终还是保证了函数签名-函数实体的唯一对应关系,进而能够实现重载。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值