当前位置: 首页 > news >正文

转函数重载之const

函数重载之const  

2012-03-10 10:17:17|  分类: C/C++学习笔记|举报|字号 订阅

 
 

        我们知道,如果函数名相同,在相同的作用域内,其参数类型、参数个数,参数顺序不同等能构成函数重载。有趣的是如果同时在类中,对于函数名相同的const函数和非const函数能够构成重载,同时它们被调用的时机为:如果定义的对象是常对象,则调用的是const成员函数,如果定义的对象是非常对象,则调用重载的非const成员函数。例如:
#include <iostream>
using namespace std;
class A
{
public:
       A( int x )
       {
              m = x;
       }
       
       int func( void )
       {
            cout << "non-const" << endl;
            m = 1700; //本函数体没有声明为const,允许修改成员数据 
            return m;
       }
       
       //函数体限制为const, 
       int func( void )const
       {
             cout << "const" << endl;             
             return m;
       }
private:
        int m;
};

int main( void )
{
    A b( 2002 );
    b.func( ); //调用 非const版本的func() 
    
    const A c( 2002 );
    c.func( ); //调用 const版本的func() 

   system( "PAUSE" );
   return 0;

}

另外,应该把不修改相应实参的形参定义为const引用,否则将限制该函数的使用,下面代码将产生编译错误:
 string::size_type find_char(string &s, char c)
 {
  while(i!=s.size()&&s[i]!=c) ++i;
  return i;
 }
 int main()
 {
  find_char("Hello World", 'o') //error
  return 0;
 }

        错误的原因:虽然字符串字面值传递给函数可以产生局部对象,但是这里形参被声明为引用,必须引用一个已存在的对象,所以上述代码才会导致编译错误。
        仅当形参是引用或指针时,形参是否为const才有重载现象。
class Account 
{  }; 
void lookup(Account &)
{ }
void lookup(const Account &)
{ }       

void lookup3(Account *)
{ }
void lookup3( Account const*)
{ }
void lookup4(Account *) //错误,不能重载
{ }
void lookup4( Account *const)//错误,不能重载
{ } 

const Account a(0);
Account b;
lookup(a);  //call lookup(const Account &)
lookup(b);  //call lookup(Account &)

注意:不能基于指针本身是否为const来实现函数的重载。例如,
 f(int *);
 f(int *const);
 以上两个函数无法构成重载。

转载于:https://www.cnblogs.com/MichaelWey/p/3971714.html

相关文章:

  • jeroMq示例之[2] [req-rep-envelopes msg identity]
  • IOS开发之 归档总结
  • 创建App IDs时选择App ID Prefix才能勾选push notifications
  • [Linux] day07——查看及过滤文本
  • TranslateAnimation详解
  • CSS编码设置篇utf-8与gb2312互转换
  • 552 you must authentication
  • 安裝PHPBB
  • ZOJ 3329 期望DP
  • C语言 21-结构体
  • Java学习笔记2:当构造方法有多个参数时考虑使用Builder
  • Perl:Perl的一些应用例子。
  • 指针传递参数_for chris
  • COCOS2D-X 精灵创建随笔
  • 太上感应篇原文
  • 分享一款快速APP功能测试工具
  • Angular6错误 Service: No provider for Renderer2
  • css属性的继承、初识值、计算值、当前值、应用值
  • fetch 从初识到应用
  • github指令
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java比较器对数组,集合排序
  • js递归,无限分级树形折叠菜单
  • TypeScript实现数据结构(一)栈,队列,链表
  • 闭包,sync使用细节
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 那些被忽略的 JavaScript 数组方法细节
  • 算法-插入排序
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 我与Jetbrains的这些年
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​iOS安全加固方法及实现
  • #stm32整理(一)flash读写
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $ git push -u origin master 推送到远程库出错
  • $.ajax()
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转) 深度模型优化性能 调参
  • (转)母版页和相对路径
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 常见的偏门问题
  • .NET 事件模型教程(二)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net程序集学习心得
  • .net经典笔试题
  • .net下的富文本编辑器FCKeditor的配置方法
  • .pyc文件是什么?
  • @html.ActionLink的几种参数格式