6-4 函数重载
目录
- 6.4.1 重载与const
- 重载与const形参
- 重载与const_cast的使用
- const_cast介绍
- const_cast与重载
- 6.4.2 重载与作用域
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
using namespace std; int main(){ const int i = 2; const int *p = &i; int *q = const_cast (p); *q = 3; cout<<"p : "<<*p< 可见,const对象的值并没有被改变,const终归是const,而*p = *q = 3是未定义行为
-
情况二:指针指向或引用绑定的是非const对象
#include
using namespace std; int main(){ int i = 2; const int *p = &i; int *q = const_cast (p); *q = 3; cout<<"p : "<<*p< 可见,非const对象的值被改变了
-
不过,我们一般不使用const_cast来改变指针或引用所指向的对象,当指向的对象为const类型时,也无法改变const对象的值。那么const_cast去除const的目的是什么呢?就是我们接下来要说的:去除const来使const对象能传给以非const对象为形参的函数。
const_cast与重载
#include
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(r1),const_cast(r2)); //编译成功,去除const限定符
return 0;
}
void sum(int &r1, int &r2){
cout<<"sum : "<
6.4.2 重载与作用域
对于刚接触C++的程序员来说,不太容易理清作用域和重载的关系。其实,重载对作用域的一般性质并没有什么改变:如果我们在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名: