转载自CSDN博客:http://blog.csdn.net/polarbearboy/article/details/6762752   (由于该作者也属于转载,不知原出处)

PS:我们很易对下面这些问题感到迷惑:为什么只有类名和方法自变量列出?为什么不根据返回值对方法加以区 
分?比如对下面这两个方法来说,虽然它们有同样的名字和自变量,但其实是很容易区分的: 
void f() {} 
int f() {} 
若编译器可根据上下文(语境)明确判断出含义,比如在 int x=f()中,那么这样做完全没有问题。然而, 
我们也可能调用一个方法,同时忽略返回值;我们通常把这称为“为它的副作用去调用一个方法”,因为我 
们关心的不是返回值,而是方法调用的其他效果。

const到底是不是一个重载的参考对象,请看下面的例子

class A
{
public:
    void f(int i){ std::cout<<"1";}; //函数1
    void f(int i) const { std::cout<<"2" ;};//函数2

};

这个地方的重载是没有问题的,说明const 修饰函数能够区分重载

class B
{
    void f(int i);
    const void f(int i);

};

这次编译器会报出 'B::f' : redefinition; 的错误,说明const作为修饰返回值不能够区分重载

class C
{
    void f(int i);
    void f(const  int i);
};

这个是错误的,编译通不过。那么是不是说明内部参数的const不予重载呢?
再看下面的例子:

class D
{
public:
    void f(int &i) { std::cout<<"3";}; //函数3;
    void f(const  int &i){ std::cout<<"4" ;};//函数4
};

这个程序是正确的,看来上面的结论是错误的。为什么会这样呢?这要涉及到
接口的透明度问题。按值传递时,对用户而言,这是透明的,用户不知道函数对形参
做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!当指针或
引用被引入时,用户就会对函数的操作有了一定的了解,不再是透明的了,这时重载
是有意义的,所以规定可以重载。

返回值不能作为区分重载的条件。

现在来看一下成员 函数调用的情况:

A a;
a.f(1);

对于以上调用,如果函数1不存在就会调用函数2,如果函数1和函数2都存在,优先调用函数1.

const A a;
a.f(1);

却只能调用函数2,如果函数2不存在,将会报错。

int i = 0;
D d;
d.f(i);

以上调用既可以调用函数3也可以调用函数4,优先调用函数3.

const int i = 0;
D d;
d.f(i);

只能调用函数4,函数3存在函数4不存在,也不能调用函数3,直接报错

总结: const 对象只能调用const 方法,非const 对象既能调用const 方法也能调用非const方法,优先调用非const方法。

如果重载的函数都是引用或指针,const 变量 只能调用带有const 参数的方法,非const 变量既能调用带const 参数的方法,也能调用不带cosnt 参数的方法,优先调用不带const 参数的方法

const与重载的更多相关文章

  1. const和非const函数重载

    成员函数后面加const,表示在该函数中不能对类的数据成员进行改变,比如下面的代码: #include <stdio.h> class A { private: mutable int a ...

  2. C++ 学习之函数重载、基于const的重载

    函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载.注意函数重载不能基于不同的返回值类型进行重载. 注意函数重载中的"形参表"不 ...

  3. 类4(可变数据成员/基于const的重载)

    可变数据成员: 有时我们希望能修改某个类的数据成员,即使是在一个 const 成员函数内.可以通过在变量的声明中加入 mutable 关键字来声明一个可变数据成员.mutable 是为突破 const ...

  4. const的重载

    class A { private: int a; public: A(int x) :a(x){}//构造函数并不能重载 void display(){ cout << "no ...

  5. [C++] const与重载

    下面的两个函数构成重载吗? void M(int a){} //(1) void M(const int a){} //(2) 下面的呢? void M(int& a){} //(3) voi ...

  6. C++中基于成员函数是否是const重载成员函数

    C++pimer中文版第四版 378页 基于const的重载 如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载.比如: ...

  7. 类的const和非const成员函数的重载

    我们从一个例子说起,来看上一篇文章中的String类, 我们为它提供一个下标操作符([ ])以读写指定位置的字符(char). 只要了解过C++的操作符重载的语法,很快就可以写出下面这个[]操作符重载 ...

  8. C++中const的全面总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...

  9. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

随机推荐

  1. 用户"IIS APPPOOL\xxxxxxxx"登录失败解决方案

    Server Error in '/' Application.-------------------------------------------------------------------- ...

  2. hdu2952Counting Sheep

    Problem Description A while ago I had trouble sleeping. I used to lie awake, staring at the ceiling, ...

  3. js如何控制css伪元素内容(before,after)

    曾经遇到的问题,在对抗UC浏览器屏蔽需要把内容输出到css 伪元素中输出.有个疑问如何用js控制它.于是在segmentfault提问,如下是对问题的整理: 如何用js控制css伪类after 简单粗 ...

  4. JVM内存模型及垃圾收集策略解析

    一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程.它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文 ...

  5. 从苹果的appstore谈谈web前端那丝毫的追求

    献上链接:点击进入itunes打开页面,我们先找到App 的logo图比如这个图很简单的一个图标,估计多数人选择的是上传一张处理好圆角,border的图片作为app logo,但问题是苹果觉得,你们每 ...

  6. URI、URL和URN之间的区别与联系

    URI:Uniform Resource Identifier,统一资源标识符: URL:Uniform Resource Locator,统一资源定位符: URN:Uniform Resource  ...

  7. 流程控制 - PHP手册笔记

    脚本由语句构成,语句靠流程控制实现功能,这一节主要介绍了几个关键字的使用. elseif elseif和else if的行为完全一样,如果用冒号来定义if/elseif条件,那就不能用两个单词的els ...

  8. Exception和IOException之间的使用区别

    Exception和IOException之间的使用区别 先看一段代码.这段代码来自<深入剖析tomcat>   public void await() { // 创建ServerSock ...

  9. 为什么开发人员对于PHP语言褒贬不一

    PHP 语言,作为服务器端开发的脚本语言,在网站开发方面非常有名.从1995年 Rasmus Lerdorf 创建之后,W3Techs 的调查显示在已知的服务端编程语言中,PHP 占了82%.其中不乏 ...

  10. 使用Java管理Azure(1):基础配置

    Azure针对Java开发人员提供了非常丰富的开发库,开发工具,和相关插件,让你通过Java对Azure进行服务管理和开发,本文第一步先介绍如何快速的配置Java开发工具,主要针对目前比较流行的Ecl ...