• 函数重载相关注意事项


    1.重载函数调用问题中的枚举类型提升

    1      void newf(unsigned char); 
    2      void newf(int); 
    3      unsigned char uc = 129; 
    4      newf(VIRTUAL); // calls newf(int) 
    5      newf(uc);      // calls newf(unsigned char) 

    枚举类型 Tokens 只有两个枚举成员, 最大的值为 129。 这个值可以用 unsigned char 类型表示,很多编译器会将这个枚举类型存储为 unsigned char 类型。然而,枚举成员 VIRTUAL 却并不是 unsigned char 类型。就算枚举成员的值能存储在 unsigned char 类型中,枚举成员和枚举类型的值也不会提升为 unsigned char 类型。

    2.“仅当形参是引用或指针时,形参是否为 const 才有影响。”,这是《C++ Primer》中的一句话,如果形参是非const引用,这种情况很好理解,不必多说;如果形参是const引用,理解起来要转个弯,《C++ Primer》中的这段话可以辅助理解:“如果传递的是非 const 对象,则上述任意一种函数皆可行。非 const 对象既可用于初始化 const 引用,也可用于初始化非 const 引用。但是,将 const 引用初始化为非 const 对象,需通过转换来实现,而非 const 形参的初始化则是精确匹配。”。有了这段话,下面这两个重载函数的调用就不会混淆:

    1      Record lookup(Account&); 
    2      Record lookup(const Account&); // new function 
    3      const Account a(0); 
    4      Account b; 
    5      lookup(a);   // calls lookup(const Account&) 
    6      lookup(b);   // calls lookup(Account&) 

     另外,“对指针形参的相关处理如出一辙。”,“注意不能基于指针本身是否为 const 来实现函数的重载:”,譬如如下代码:

    1      f(int *); 
    2      f(int *const); // redeclaration 

    “此时,const 用于修改指针本身,而不是修饰指针所指向的类型。”

  • 相关阅读:
    在线教育项目-day07【添加分类前端】
    在线教育项目-day07【课程分类显示接口】
    在线教育项目-day05【实现EasyExcel对Excel操作】
    在线教育项目-day05【上传头像实现】
    在线教育项目-day05【nginx】
    在线教育项目-day05【Swagger问题】
    在线教育项目-day05【上传头像功能】
    在线教育项目-day04【路由问题】
    在线教育项目-day04【后台讲师修改功能】
    在线教育项目-day04【后台讲师添加模块】
  • 原文地址:https://www.cnblogs.com/tingshuixuan2012/p/2991012.html
Copyright © 2020-2023  润新知