形参仅区别于是否const的重载

在《重载函数的概念》一文中,提到过“Record lookup(Phone);”和“Record lookup(const Phone);”并不是重载,因为形参仅仅区别在是否const。在那篇文章的结尾,还留了一句话:“有的时候可以凭是否const来重载,比如引用传递 和指针传递。”
  这里就有必要知道引用传递、指针传递和值传递前加const的实质了。
  首先要说的是,非const的引用和非const的指针都可以传递给const的形参。也就是说,即使没有重载,只有const形参这一种函数,也可以处理对非const和const的实参的调用。这句话说来有些不顺嘴,举个例就明白了:
void print (int& t);//函数一
void print (const int& t);//函数二
int i = 3;
const int j = 4;
print(i);//语句一
print(j);//语句二
  如果没有函数一的话,以上语句一和语句二都可以调用函数二。如果有了函数一,那么语句一将调用函数一。
   对于值传递,因为形参是复制传递进函数的,函数内无法改变实参。那么,加不加const对于实参来说没有任何区别。只有引用传递和指针传递,const 才是实实在在地保护了实参。函数调用的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。
  那么,值传递的函 数那个const是不是白加了?我认为不是。虽然const对保护实参不起作用,而保护形参也没有太大的必要,但是这样做可以减少很多BUG。很简单的例 子就是你将“if (i == j)”写成“if (i = j)”时,如果i是一个const形参,编译器将帮你查出这个问题。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值