c++引用

引用是给变量取一个别名,所以引用传递会直接进行变量本身的传递。它的最大好处是可以把别处对变量的改变保留下来,第二好处是它提高了性能:如果函数的返回值是一个引用,那么,如上文所说,它会节约一组构造、赋值和析构过程。但是,函数返回引用往往会带来一些意想不到的错误:比如返回栈内存的引用,这是错误的

 int & F(int x)

{

       int u=0;

      return u; //这是错的

}

  另外一种用法就是在类的成员函数中返回类对象自身了,典型的是“operator +=”函数之类。
MyClass &MyClass::operator +=(const MyClass &other)
{
  //某些语句
  return *this;//这是对的
}
  以上函数返回的是自身的引用。因为类的成员函数也可以写成全局函数“MyClass &operator +=(MyClass &Left, const MyClass &right)”,而且在类成员函数的调用中实际存在着this指针的传递。所以,以上这个函数依然可以看作返回了形参的引用。
 不能用引用来传递临时值。有时候我们的确要产生一个临时对象并返回它,那就不能返回引用。典型的有“operator +”函数:
const MyClass MyClass::operator +(const MyClass &other) const
{
  MyClass Temp;
  //某些语句
  return Temp;//这里只能返回对象,因为Temp必须是局部变量,不可以返回引用
}

利用引用作为函数的形参可以在调用函数的过程中不是用传递值的方式进行虚实结合,而是通过传址方式使形参成为实参的别名,因此不生成临时变量(实参的副本),减少了时间和空间的开销。此外,如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左侧而成为左值(left value),可以被赋值或参与其他操作 (如保留cout流的当前值以便能连续使用“<<”输出)。

例如可以这样定义String 类
String &String::operator =(const String &other)   

 


if(this == &other)
return *this;


delete [] m_data;

int length = strlength(other.m_data);   
m_data = new char[length+1];       
strCopy(m_data, other.m_data);

return *this;
}


注意当返回值的时候,这样return的效率:

return string(x+y)

string temp(x+y);

return temp

这是不一样的!!!上面时创建临时变量并返回,这存在的是外部的存储单元,而下面等函数执行完,temp会释放,是基本数据类型的话存在拷贝的过程,对象的话存在拷贝构造和析构的过程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值