Loading

6-4 函数重载

6.4.1 重载与const

重载与const形参

参数调用时会忽略顶层const,而不会忽略底层const

// 重复声明了lookup
void lookup(int i);
void lookup(const int i);
// 重复声明了lookup
void lookup(int *i);
void lookuo(int* const p);
void lookup(int &i);       //作用于int的引用
void lookup(const int &i); //新函数,作用于int的常量引用

void lookup(int *i);       //作用于int的指针
void lookup(const int* p); //作用于指向int常量的指针

注:由于非const类型参数可以转换为常量类型,而const类型参数不能转换为其他类型。

所以任何类型的参数都可以传给以const类型为形参的函数,且const类型只能传给以const类型为形参的函数。

那么,当要把const对象当作传入以非const对象为形参的函数时该怎么办呢?使用const_cast。【见下文】

重载与const_cast的使用

const_cast介绍

const_cast<去const后的指针或引用>(const指针或引用)

  • 情况一:指针指向或引用绑定的是const对象

    #include<iostream>
    using namespace std;
    
    int main(){
        const int i = 2;
        const int *p = &i;
        int *q = const_cast<int*>(p);
        *q = 3;
        cout<<"p : "<<*p<<endl;
        cout<<"q : "<<*q<<endl;
        cout<<"i : "<<i<<endl;
        return 0;
    }
    /*
    p : 3
    q : 3
    i : 2
    */
    

    可见,const对象的值并没有被改变,const终归是const,而*p = *q = 3是未定义行为

  • 情况二:指针指向或引用绑定的是const对象

    #include<iostream>
    using namespace std;
    
    int main(){
        int i = 2;
        const int *p = &i;
        int *q = const_cast<int*>(p);
        *q = 3;
        cout<<"p : "<<*p<<endl;
        cout<<"q : "<<*q<<endl;
        cout<<"i : "<<i<<endl;
        return 0;
    }
    /*
    p : 3
    q : 3
    i : 3
    */
    

    可见,非const对象的值被改变了

  • 不过,我们一般不使用const_cast来改变指针或引用所指向的对象,当指向的对象为const类型时,也无法改变const对象的值。那么const_cast去除const的目的是什么呢?就是我们接下来要说的:去除const来使const对象能传给以非const对象为形参的函数。

const_cast与重载

#include<iostream>
using namespace std;
void sum(int &r1, int &r2);

int main(){
    const int m=1, n=2;
    const int &r1 = m, &r2 = n;
    // sum(r1,r2);           //编译错误,const int&无法转换为int&
    sum(const_cast<int&>(r1),const_cast<int&>(r2));  //编译成功,去除const限定符
    return 0;
}
void sum(int &r1, int &r2){
    cout<<"sum : "<<r1+r2<<endl;
}
/*
sum : 3
*/

6.4.2 重载与作用域

对于刚接触C++的程序员来说,不太容易理清作用域和重载的关系。其实,重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名:

image-20220123121828337

image-20220123121841462

posted @ 2022-02-20 08:16  咪啪魔女  阅读(28)  评论(0编辑  收藏  举报