函数重载相关注意事项

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 用于修改指针本身,而不是修饰指针所指向的类型。”

原文链接: https://www.cnblogs.com/tingshuixuan2012/archive/2013/03/30/2991012.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/82651

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午8:41
下一篇 2023年2月9日 下午8:42

相关推荐