转载自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. 追加addclass和removeclass

    //addclass             Base.prototype.addclass=function(classname){                 for(var i=0;i< ...

  2. 实现一个宽和高都是100像素的div可以用鼠标拖拽移动的效果

    html,body{ width:100%;height:100%;margin:0px;padding:0px; } #box{ width:100px;height:100px;backgroun ...

  3. ckplayer 项目实际应用代码整理,支持标清,高清,超清切换!

    ckplayer是个免费,小巧,功能强大的视频播放器,前段时间有个项目需要做个收费视频播放的功能,于是就用了ck,目前项目已经弄完,完美支持pc和手机端的播放,重要的是可以支持清晰度切换,最后加了个是 ...

  4. discuz二次开发笔记(三)------discuz的安装步骤

    下载好discuz的安装包后,解压在自己定义的文件夹里面,将upload里面的文件拷贝出来放到和upload同级的地方,然后删除upload文件夹. 打开浏览器,输入你文件夹的地址:如:http:// ...

  5. WndProc Message消息解释

    public class WindowsMessage { public const int WM_NULL = 0x0000; // public const int WM_CREATE = 0x0 ...

  6. 安装Jenkins后 启动时失败的问题解决

    命令行执行,java -jar jenkins.war,报错 ------------------------------- SEVERE: Container startup failed java ...

  7. 使用SelectClipRgn注意事项

    SelectClipRgn 函数功能:该函数选择一个区域作为指定设备环境的当前剪切区域. 函数原型:int SelectClipRgn(HDc hdc, HRGN hrgn): 参数: hdc:设备环 ...

  8. Nginx 配置指令的执行顺序(十一)

    紧跟在 post-access 阶段之后的是 try-files 阶段.这个阶段专门用于实现标准配置指令 try_files 的功能,并不支持 Nginx 模块注册处理程序.由于 try_files  ...

  9. Unable to execute dex: Multiple dex files define Lorg/ap (

    解决这个问题的方法,直接把commons-collections.jar这个jar包删除,一定要删干净啊,各个地方看一下,再clean下,应该没问题了!根据这个英文的目录指示就是Unable to e ...

  10. 全选demo

    我们处理数据时,最好能够支持全选操作. 选中之后,进行删除,或其他处理. 我自己写了一个demo. 主要功能: 1.点击全部选中 2.点击全部取消 3.然后进行获取选中的id,进行处理 代码如下: & ...