精华内容
下载资源
问答
  • C语言实现函数重载

    万次阅读 2017-04-09 22:58:49
    使用函数指针来实现重载的函数不能使用同名称,只是类似的实现了函数重载功能 重载函数使用可变参数,方式如打开文件open函数 gcc有内置函数,程序使用编译函数可以实现函数重载 示例如下: #...

    C语言实现函数重载

    c语言中不允许有同名函数,因为编译时函数命名是一样的,不像c++会添加参数类型和返回类型作为函数编译后的名称,进而实现重载。如果要用c语言显现函数重载,可通过以下方式来实现:

    • 使用函数指针来实现,重载的函数不能使用同名称,只是类似的实现了函数重载功能
    • 重载函数使用可变参数,方式如打开文件open函数
    • gcc有内置函数,程序使用编译函数可以实现函数重载

    示例如下:

    #include<stdio.h>
    
    void func_int(void * a)
    {
        printf("%d\n",*(int*)a);  //输出int类型,注意 void * 转化为int
    }
    
    void func_double(void * b)
    {
        printf("%.2f\n",*(double*)b);
    }
    
    typedef void (*ptr)(void *);  //typedef申明一个函数指针
    
    void c_func(ptr p,void *param)
    {
         p(param);                //调用对应函数
    }
    
    int main()
    {
        int a = 23;
        double b = 23.23;
        c_func(func_int,&a);
        c_func(func_double,&b);
        return 0;
    }

     

    展开全文
  • 前段时间学习C++,发现C++有个函数重载的情况。(以下介绍来自百度百科)重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似...不能只有函数返回值类型不同。我查了一下关于Python的函数...

    前段时间学习C++,发现C++有个函数重载的情况。

    (以下介绍来自百度百科)重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。不能只有函数返回值类型不同。

    我查了一下关于Python的函数重载,发现Python并不支持函数重载。

    但是,我发现可以通过其他的一些方法,来实现这个函数重载。

    通过在网上搜索,找到一些使用Python实现函数重载的方法,这其中就有几种“假的”函数重载,他们根本就没有领会到函数重载的优雅之处。

    最后看到一个博客上写的用Python实现的函数重载,我觉得非常的好,在这里就与大家分享一下。

    实现过程主要分为三个部分,1、包装函数(Wrapped the function);2、构建虚拟命名空间(Building the virtual Namespace);3、使用使用装饰器作为钩子(Using decorators as a hook)。

    /01/ 包装函数

    包装函数的目的在于,可以包装任何函数,并通过一个被覆盖的__call__方法使其可调用,同时它还公开了一个名为key的方法,该方法会返回一个元组,这使得这个函数在整个代码库中是唯一的。

    classFunction(object):def __init__(self, fn):

    self.fn=fndef __call__(self, *args, **kwargs):

    fn= Namespace.get_instance().get(self.fn, *args)if notfn:raise Exception("No matching function found.")return fn(*args, *kwargs)def key(self, args=None):if args isNone:

    args=getfullargspec(self.fn).argsreturntuple(

    [

    self.fn.__module__,

    self.fn.__class__,

    self.fn.__name__,

    len(argsor[]),

    ]

    )

    /02/ 构建虚拟命名空间

    构建的虚拟命名空间将存储我们在定义阶段收集的所有函数。由于这里只有一个命名空间/注册表,我们创建了一个单例类来将函数保存在一个字典中,这个字典的键将不仅仅是一个函数名,而是我们从key函数获得的元组,它包含了在整个代码库中唯一标识函数的元素。通过这样做,我们就可以在注册表中保存函数了,即使它们有相同的名称(但有不同的参数),从而促进函数重载。

    classNamespace(object):__instance =Nonedef __init__(self):if self.__instance isNone:

    self.function_map=dict()

    Namespace.__instance =selfelse:raise Exception("Cannot instantiate a virtual Namespace again")

    @staticmethoddefget_instance():if Namespace.__instance isNone:

    Namespace()return Namespace.__instance

    defregister(self, fn):

    func=Function(fn)

    self.function_map[func.key()]=fnreturnfuncdef get(self, fn, *args):

    func=Function(fn)return self.function_map.get(func.key(args=args))

    /03/ 使用装饰器作为钩子

    因此,创建了名为overload的装饰器,它会在虚拟命名空间中注册这个新包装器函数并返回一个可调用对象。

    defoverload(fn):return Namespace.get_instance().register(fn)

    /04/ 测试

    @overloaddefarea(a, b):

    s= a *bprint("长方形的面积是:", s)returns

    @overloaddefarea(r):

    s= 3.14 * r ** 2

    print("圆的面积是:", round(s, 2))returns

    @overloaddef area(a, b, c) ->float:

    v= a * b *cprint("立方体的体积是:", v)returnvif __name__ == "__main__":

    area(2)

    area(3, 4)

    area(1, 2, 3)

    这才是有灵魂的函数重载嘛!

    ▼​

    函数重载也算是为自己多提供了一个思路。

    展开全文
  • 没有重载:JavaScript函数不能像传统意义上那样实现重载。而在其他语言中,可以为一个函数编写两个定义,只要这两个定义签名(接受参数类型和数量)不同即可。JavaScript函数没有签名,因为其参数是由包含零或...

    在看到《JavaScript高级程序设计》 没有重载 这部分时,想更加深入了解下重载,于是在网上搜集了一些信息,以下是这部分的总结整理:

    没有重载:JavaScript函数不能像传统意义上那样实现重载。而在其他语言中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。JavaScript函数没有签名,因为其参数是由包含零或多个值得数组来表示的。而没有函数签名真正的重载是不可能做到的。

    虽然没有重载,但我们通常可以这样来实现模拟重载:

    1判断传入参数的个数

    Javascript的每个函数都带有一个仅在这个函数范围内作用的变量——arguments,它是一个包含所有传给函数的参数的伪数组。为什么是伪数组?——你不能修改它,也不能用push来添加新元素等。但是你可以访问其中的元素,并且同时具有.length属性。有了length属性,我们就可以很方便的知道函数传入了几个参数。


    function send( message, who ) {
    if( arguments.length >= 2 ) {
    console.log("你对" + who + ":" + message);
    }
    else {
    console.log("你对大家说:" + message);
    }
    }

    2判断传入参数的类型

    如果我们在函数中并没有提供参数,那么messagewho的值一定为'undefined'。我们可以使用typeof message = 'undefined'来判断是否传入了参数。


    function send( message ) {
    if( typeof message === 'undefined' ) {
    console.log("ERROR:错误的信息内容");
    }
    else {
    console.log("你说:" + message);
    }

    }

    下面是我看到的一种更好的方法,目前还不太能完全理解:


    JQuery之父John Resig写的《secrets of the JavaScript ninja里的一个绝佳巧妙的方法!那种方法充分的利用了闭包的特性!

      在介绍这个方法之前,我们先来看看外国人名字组成哈,比如,John ResigJohnfirst-nameResiglast-name,就相当于我们的姓名由姓和名组成一样。我们现在有这样的一个需求,有一个people对象,里面存着一些人名,如下:

    var people = {
      values: ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"]
    };

    我们希望people对象拥有一个find方法,当不传任何参数时,就会把people.values里面的所有元素返回来;当传一个参数时,就把first-name跟这个参数匹配的元素返回来;当传两个参数时,则把first-name和last-name都匹配的才返回来。因为find方法是根据参数的个数不同而执行不同的操作的,所以,我们希望有一个addMethod方法,能够如下的为people添加find的重载:

    addMethod(people, "find", function() {}); /*不传参*/
    addMethod(people, "find", function(a) {}); /*传一个*/
    addMethod(people, "find", function(a, b) {}); /*传两个*/

     这时候问题来了,这个全局的addMethod方法该怎么实现呢?John Resig的实现方法如下,代码不长,但是非常的巧妙:

    function addMethod(object, name, fn) {
      var old = object[name]; //把前一次添加的方法存在一个临时变量old里面
      object[name] = function() { // 重写了object[name]的方法
        // 如果调用object[name]方法时,传入的参数个数跟预期的一致,则直接调用
        if(fn.length === arguments.length) {
          return fn.apply(this, arguments);
        // 否则,判断old是否是函数,如果是,就调用old
        } else if(typeof old === "function") {
          return old.apply(this, arguments);
        }
      }
    }

     现在,我们一起来分析一个这个addMethod函数,它接收3个参数,第一个为要绑定方法的对象,第二个为绑定的方法名称,第三个为需要绑定的方法(一个匿名函数)。函数体的的分析已经在注释里面了。 

     OK,现在这个addMethod方法已经实现了,我们接下来就实现people.find的重载啦!全部代码如下

    //addMethod
    function addMethod(object, name, fn) {
      var old = object[name];
      object[name] = function() {
        if(fn.length === arguments.length) {
          return fn.apply(this, arguments);
        } else if(typeof old === "function") {
          return old.apply(this, arguments);
        }
      }
    }
     
     
    var people = {
      values: ["Dean Edwards", "Alex Russell", "Dean Tom"]
    };
     
    /* 下面开始通过addMethod来实现对people.find方法的重载 */
     
    // 不传参数时,返回peopld.values里面的所有元素
    addMethod(people, "find", function() {
      return this.values;
    });
     
    // 传一个参数时,按first-name的匹配进行返回
    addMethod(people, "find", function(firstName) {
      var ret = [];
      for(var i = 0; i < this.values.length; i++) {
        if(this.values[i].indexOf(firstName) === 0) {
          ret.push(this.values[i]);
        }
      }
      return ret;
    });
     
    // 传两个参数时,返回first-name和last-name都匹配的元素
    addMethod(people, "find", function(firstName, lastName) {
      var ret = [];
      for(var i = 0; i < this.values.length; i++) {
        if(this.values[i] === (firstName + " " + lastName)) {
          ret.push(this.values[i]);
        }
      }
      return ret;
    });
     
    // 测试:
    console.log(people.find()); //["Dean Edwards", "Alex Russell", "Dean Tom"]
    console.log(people.find("Dean")); //["Dean Edwards", "Dean Tom"]
    console.log(people.find("Dean Edwards")); //["Dean Edwards"]




    展开全文
  • 先说明下啥是重载: 函数重载指一个标识符被用作多个函数名,且能够通过函数参数个数或参数类型将这些同名函数区分开来,调用不发生混淆。 可以使类里面某个方法产生多种效果,根据传入参数不同,...2、不能...

    先说明下啥是重载:

    函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。

    可以使类里面的某个方法产生多种效果,根据传入参数不同,可以执行不同的逻辑。

     

    有以下几点要求:
    1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
    2、不能通过访问权限、返回类型、抛出的异常进行重载;
    3、方法的异常类型和数目不会对重载造成影响;

     

    PHP重载的思路

    1.  使用魔术方法__call,method_exists,call_user_fun_array(),即可实现PHP重载。

    2.  闭包嵌套模式也可以实现。

     

    展开全文
  • 复习:重载

    2021-03-15 01:11:59
    方法重载是相对于一个类之间,它有以下特点: 在使用重载时只能通过相同方法名、不同参数形式实现。...不能通过访问权限、返回类型、抛出异常进行重载; 方法异常类型和数目不会对重载造成影响; ...
  • 首先,方法重载和方法重写都是多态的体现方式之一 方法重载是编译时多态,方法写则是运行时多态的一种实现方式。...抛出的异常类型不能大于父类抛出的异常类型。但如果抛出的是运行时异常,则没有限制。 ..
  • 本文记录一下java中方法的重写和重载的区别。 1)JAVA中方法的重写也就是我们说的覆盖。Override 一般是在继承的时候,重写父类的方法,实现子类需要的功能。那么重写的时候,要遵循的规则有以下几种: (1)重写...
  • C++ 运算符重载

    2019-04-21 18:49:11
    : sizeof这些不能做运算符重载 运算符重载基本上出现在类中和结构中: 运算符重载要满足原来规则 运算符理解为函数一个表现 首先考虑返回值,只能返回一个新变量只能用拷贝; operator运算符 来代表...
  • 简单运算符重载

    2018-04-05 23:36:22
    实现两个字符串拼接C++几乎可以重载全部运算符,而且只能够重载C++中已经有的以下五个运算符不能重载:"." ".*" "::" "?:" "sizeof"重载之后运算符优先级...
  • (2)重载运算符与原来运算符优先级、结合性以及操作数数目相同,如双目运算符不能重载为单目; (3)保留运算符本身含义,如“+”号重载后应该保持其“求和”自然含义; (4)操作数中至少有一个为自定义...
  • 覆盖又叫重写,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同作用。对我们来说最熟悉覆盖就是对接口方法...1、重写方法参数列表必须完全与被重写方法相同,否则不能称其为重写而是重...
  • 这就说明了,如果要将用户自定义类型值传递给基本数据类型变量,只能通过类型转换机制,而不能利用重载实现。 当赋值号两边表达式不一致时候,可能需要对赋值操作符进行重载,见下面例子。 #include ...
  • C++运算符重载

    2013-06-06 23:22:58
    在运算符重载运用时应该注意以下几个问题:(1)C++中只能对已有C++运算符进行...(3)重载不能改变运算符操作对象(操作数)个数。如:"+"是实现两个操作数运算符,重载后仍然为双目运算符;(4)重载不能改变运算符
  • /*重载() 只能用成员函数,不能友元 重载(),其函数调用格式一般为(表达式) 可以看成是一个二元运算符...以下举个例子:用以实现数学函数抽象 */ #include using namespace std; class F { public:
  • 虚函数就是实现函数覆写, 它们以下特点: ...还有,要注意一点,函数返回值是影响了覆写和重载函数.     我的以下程序,思路 不对地方就是没完全理解多态应用, #include #includ
  • 这些魔术方法参数都不能通过引用传递。 当调用当前环境下未定义或不可见类属性或方法时,重载方法会被调用。 所有的重载方法都必须被声明为 public。 二、属性重载 __set():在给不可访问属性赋值时,会调用...
  • 包装仅仅具有把过程和函数打包功能,还有其他只有通过包能实现的功能: 首先解释第一个功能:制作多个同名过程函数。 例如,有些函数,内容相同,但是参数类型和数量不同,就可以用包来实现。这个定义称为...
  • 1.方法重载 和C++函数重载一样,主要是实现...用来描述一个对象结构,但是类不能直接使用,必须生成对象后才能使用 对象 通过类来生成一个对象, 根据类生成对象都具备相同行为(class成员函数),但是属性(c...
  • (4)基类函数必须有virtual关键字 还有,要注意一点,函数返回值是影响了覆写和重载函数. 我的以下程序,思路 不对地方就是没完全理解多态应用,#include #include #include using name
  • override为覆盖又叫重写,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同作用。...在覆盖要注意以下的几点: 1、重写方法参数列表必须完全与被重写方法相同,否则不能称其为重写而是重
  • CD 子类必须重载父类里虚函数 子类必须重载父类里纯虚函数 ...带有纯虚函数不能直接实例化 子类实现父类虚函数叫重写,不叫重载; 父类有纯虚函数,子类可以不实现,此时子类仍是抽象类。 ...
  • C++赋值运算符重载

    2014-06-11 23:04:53
    实现对象成员间的一一赋值,实现的是一个浅拷贝(logic copy)。 当数据成员里面如果有指针,则编译器默认的赋值运算符不能满足要求,会出现内存泄露。 浅拷贝:通过对象之间的一一赋值,使得对象中的指针...
  • 自己实现C++string类

    2019-09-26 07:31:43
    使用C++朋友对string类都不会陌生,string类使用起来很是方便,比C字符数组好用多了,但是我们能不能自己实现一个属于自己string类呢? 实现一个具有基本功能string类并不难,但是还是得掌握以下几点知识:...
  • 重写与重载

    2012-06-11 13:21:34
    override为覆盖又叫重写,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同作用。...在覆盖要注意以下的几点: 1、重写方法参数列表必须完全与被重写方法相同,否则不能称其为重写而是重...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

以下不能实现重载的是