最近看别人代码,CPlayerMgr::Updatepr_player(const sPlayerInfo& kPlayer)
这个函数里面的形参为什么这么修饰,一直没怎么搞明白,网上查了下,把弄清楚为什么要这么写
const sPlayerInfo& kPlayer const 表示常量不可修改,这应该好理解,表示传进去的参数kPlayer不能被修改。 但是为什么要加个引用呢
const sPlayerInfo& kPlayer 与 const sPlayerInfo kPlayer有什么区别呢
参考了别人的一篇文章
1.非引用形参
void add1(int v1)
{
v1+=1;
}
这是最普通的形参方式,当函数被调用时,实参的副本初始化形参,函数并没有访问调用所传递的实参,因此v1+=1不会修改实参的值。对v1的操作只是修改了实参的一个副本。
2. 引用形参
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
引用形参直接关联到其所绑定的对象,而非这些对象的副本。 所以这种方法可以修改实参的值,而且更加直观。
看到这里就明白 非引用形参的函数访问的其实是实参的副本,既然是副本,那当然是另外拷贝复制一份出来的,
对于某些巨型类来说复制的速度非常慢, 而且也会有些类型在设计上拒绝复制(比如说cin和cout).
所以人家用的是 const sPlayerInfo& kPlayer 而不是 const sPlayerInfo kPlayer 这样可以减少复制,提升效率,如果不考虑效率,其实两者的意义是一样的。
但是, 对于int这样的小型的内置类型来说, 这丙种这几乎就真的没有差别了, 对于引用通常需要地址来传递, int类型占据的内存和地址一样或者更小(64位机器指针是64位大小)