转载自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. 百度搜索附近加盟店等基于LBS云搜索功能的实现

    一.注册百度账号,进入开发者平台 创建应用并获取ak 地址如下 http://lbsyun.baidu.com/apiconsole/key/update?app-id=7546025 ok获取到了. ...

  2. 如何安装chrome扩展,以json-handle

    读取本地json文件 chrome插件安装 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json ...

  3. 《C++ Primer Plus 6th》读书笔记 - 第十一章 使用类

    1. 运算符重载 2. 计算时间:一个运算符重载示例 3. 友元 1. 友元有三种: 友元函数 友元类 友元成员函数 4. 重载运算符:作为成员函数还是非成员函数 5. 再谈重载:一个矢量类 6. 类 ...

  4. 一段简单c程序的汇编语言学习(ubuntu+x86)

    c程序代码: #include <stdio.h> int main(void) { int i=0, j=0; for(i=0; i<8; i++) j=j+1; return 0 ...

  5. phonegap退出android程序

    最近用android做了一个程序,在点“后退”的时候,会不停地后退,感觉不好. 查了些资料有这么些: 一.toast_plugin插件 <script type="text/javas ...

  6. 今年暑假不AC(贪心)

    今年暑假不AC 点我 Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日 ...

  7. CodeForces 187A Permutations

    反向思维,先求数组中不用处理的元素个数,再用n减去这个数,得到结果. #include <iostream> #include <cstring> #define maxn 2 ...

  8. Git学习02 --暂存区,撤销修改,删除文件

    工作区和暂存区概念: 工作区(Working Directory)就是你在电脑里能看到的目录. 版本库(Repository) 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. Gi ...

  9. android activity启动的时候隐藏软键盘

    1.概述 android如果界面有EditText之类的跳软键盘的控件  在跳转到该界面是默认会跳出软键盘的. 更何况有些需求要直接需要获取焦点 <requestFocus /> 如果是E ...

  10. USB OTG介绍(转载)

    1. 概要 OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力,ID悬空被称作为B-Devic ...