zoukankan      html  css  js  c++  java
  • const与重载

    转载自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 参数的方法

  • 相关阅读:
    前端面试题
    js collection
    javascript变量声明提升(hoisting)
    css3动画
    神奇的meta
    wap站bug小结
    前端collection
    js拾遗
    prototype之初印象
    自定义scrollBottom的值
  • 原文地址:https://www.cnblogs.com/limera/p/constOverload.html
Copyright © 2011-2022 走看看