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++的程序员来说,不太容易理清作用域和重载的关系。其实,重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名:
标签:const,函数,int,void,cast,lookup,重载 来源: https://www.cnblogs.com/timothy020/p/15914804.html