const引用(常引用)有感

本文探讨了C++中const引用的作用与应用场景,包括提高效率、实现无争议的重载及约束引用行为等方面,并通过实例代码进行说明。
下午听完微软的宣讲会去接女友的时候,女友刚出来就问我:“你知道啥是常引用吗?就是const引用”
我说“我知道啊。”
然后女友就问我为什么要用常引用?

我当时想const引用挺常用么,在重载操作符就用过,前几天自己还动手写过,见附录第七行。
可是我马上陷入了这个思考,为什么要用const引用,既然不能修改他的值,为什么不能直接用形参,而非要用const引用的形参。

女友说他查找了网上的一些资料,也没有什么太大的头绪。
我当时脑子也比较混乱,然后就想回去查看一下资料,但应该是和效率有关系的,因为一般值传递要拷贝,内置类型可能影响不大,如果是比较复杂的类类型就会大大降低效率。
回来后,查找了一下c++primer,鲜有提及为什么要有const引用,可是我在翻看前面内容的时候,看到了重载,而重载的形参为const或非const对重载产生影响只在形参为引用或指针时才有影响(P235),这很好理解,因为如果不是引用或指针形参,那么 const形参和普通形参都不会对原变量或原其他类型数据产生影响,所以重载会报重复声明。比如:
Record lookup(Phone);
Record lookup(const Phone);  //redeclaration
这让我陷入了另一个沉思,那就是,引用形参和非引用形参能否构成重载呢?
如果能,那为什么还要const 引用形参?直接使用普通形参和引用形参不就能实现重载了?
我仿佛找到了const引用形参存在的理由之一,没错,就是引用和非引用形参应该不能构成重载,马上翻书找,发现鲜有提及(我是没翻到这样的内容)。上网搜索,有人已经作了尝试:http://bbs.csdn.net/topics/290085042
由此可见,在一些情况下调用会报错,所以,const引用存在的理由之一就是为了没有异议的重载实现。
另外,关于const引用变量,还有一个要注意的地方,那就是const引用的变量不能直接修改其值,但可以改变其指向的对象的值来修改这个变量的值。
并且又补充了一下引用变量的知识。引用变量在设置完与某个变量关联以后,将一直效忠他,这点跟const指针很像。比如int rare=1; int other=2;  int &pt=rare;  pt=other;  这时并没有重新绑定,而是rare值变为2了,因此它只能通过初始化来设置引用,而不能通过赋值。
这也让我对c++中const的实现有兴趣去研究一下,其中某个原因是const到底仅仅保持变量的值不变还是能够再保持多种内容不变。暂时想到的它应该只能保持变量的值不变,因为我能想到的如果它能保持更多的值不变的几种情况都排除了,其中一种情况就是:const 变量,变量值不变,改变变量的地址,但是,C++可以操作内存,但是不能操作内存地址,这是操作系统底层的权限。
另外还有一种情况就是const引用,以为值不变可以改变其引用绑定的值,后来发现只能初始化时绑定,一绑定就是一辈子。
还有一种情况就是const变量,先不用变量初始化他,然后再初始化,那么他的地址就变了,看看const能不能保持指针变量不变,然后迅速写了个测试程序,结果:
#include <iostream>

using namespace std;

int main(){
int a=0;
const int* p;
cout<<p<<endl;
p=&a;
cout<<p<<endl;
return 0;
}
输出为:
CCCCCCCC
0012FF44
依然不能保持啊。。。
那这个const指针保持的是哪一个??指向的变量的值??
#include <iostream>

using namespace std;

int main(){
int a=0;
const int* p;
cout<<p<<endl;
p=&a;
cout<<p<<endl;
cout<<*p<<endl;
a=3;
cout<<*p<<endl;
return 0;
}
输出为:
CCCCCCCC
0012FF44
0
3
也没保持。。。擦。。估计是保持的变量值,初始化然后绑定的那次变化不算,所以说暂时想到的是只保持一个。还是要看其实现源代码啊。


附录:
#include <iostream>
#include <string>

using namespace std;

class Item_base{
friend ostream& operator<<
(ostream&,const Item_base&);
public:
Item_base(const std::string &book ="",double sales_price=0.0):isbn(book),price(sales_price){}
std::string book() const {return isbn;}
virtual double net_price(size_t n) const
{return n*price;}
virtual ~Item_base(){}
private:
std::string isbn;
protected:
double price;
};




class Bulk_item: public Item_base{
public:
double net_price(size_t) const;
Bulk_item(const std::string& book ="",double sales_price=0.0,size_t qty=0,double disc_rate=0):
Item_base(book,sales_price),min_qty(qty),discount(disc_rate){}
private:
size_t min_qty;
double discount;
};

ostream&  operator<< (ostream& out,const Item_base& item){
out<<item.isbn<<item.price<<endl;
return out;
}

double Bulk_item::net_price(size_t cnt) const
{
if(cnt>=min_qty)
return cnt*(1-discount)*price;
else
return cnt*price;
}

void print_total(ostream &os,const Item_base &item,size_t n)
{
os<<item.net_price(n)<<endl;

}

void print_isbn(ostream &os,const Item_base &item)
{
os<<item.book()<<endl;
}

int main(){
Item_base item("123",10);
Bulk_item item1("124",11,4,0.7);
cout<<item1.net_price(5)<<endl;
print_isbn(cout,item);//运行时绑定类型为Item_base的item
print_isbn(cout,item1);//运行时绑定类型为Bulk_item的item1
return 0;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值