ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

6-4 函数重载

2022-02-20 08:33:37  阅读:158  来源: 互联网

标签:const 函数 int void cast lookup 重载


目录

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

标签:const,函数,int,void,cast,lookup,重载
来源: https://www.cnblogs.com/timothy020/p/15914804.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有