成员函数返回引用用法示例

用一个测试函数加以说明:

class TEST

{
   public:
   int m =88;
   const int& fun()
    {
      //cout<<"address of m is: "<<&m<<endl;    //m的地址为0x7fff8cad2d48
      return m;
    }
};

 

int main()
{
  TEST test;
  cout<<"address of &test.fun() is "<<&test.fun()<<endl;        
  //此函数返回m的引用,即m的一个别名。所以其地址应该与m相同,即0x7fff8cad2d48

  constint& x = test.fun();
//等号左边是定义了一个变量别名,右边恰好是个引用(亦即别名)。把别名赋值给别名(说是这么说,但实际上并非把一个int的引用绑定到另一个int的引用上。而是应该把等号右边直接看作m。因为所有通过引用的访问本质上是直接访问所引用的对象),所以现在x和test.fun()和m其实是同一个东西。现在x的值是88.
  cout<<"addressof x is "<<&x<<endl;          //address of x is 0x7fff8cad2d48

 

  int& y =test.m;
//等号左边是定义了一个变量别名,右边是个变量m。这条语句的意思也就是为变量m定义了一个新的别名叫y。那么现在y和m表示的是同一个东西。现在y的值是88.
  cout<<"address of y is "<<&y<<endl;          //address of y is 0x7fff8cad2d48

 

  int z;
  z = test.fun();
//等号左边是个变量,右边是个引用(亦即别名)。把别名赋值给变量(还是那句话,凡是通过引用进行的访问都是直接访问所引用的变量本身,所以等号右边其实可以看作是m本身),那么现在变量z的值和别名的值是相同的,都是88.
  cout<<"address of z is "<<&z<<endl;          // address of z is 0x7ffd2ed3d1a4

return 0;
}

总结起来,引用是指定义一个变量作为另一个变量的别名。通过引用访问是直接访问到所引用的变量。引用其实就是一种别名,任何使用引用的地方,都可以直接替换为该引用所引用的对象。看下面这样一个例子:

int i = 1;
int& r = i;
auto a = r;

那么a是什么类型呢?答案是int,而不是int&,可以理解为直接把右边的r换成i。这就是所谓的“别名”,用到该引用的地方,直接换成所引用的变量,大部分情况下如此。有一个例外,那就是c++中最为“诚实”的decltype,给它引用它就是引用,给它数组它就是数组,而不会变成相应的指针。

decltype(r) n = r;

n是什么类型呢?当然是int&啦。问题就来了,把一个int的引用绑定到一个int的引用上???当然不是,把等号右边的r换成i,这不就行了。

编译器在编译与引用有关的代码时,往往会进行优化,所以有的时候引用看起来就是变量,有时候其实际效果又像是指针。具体是什么原理需要反汇编来探究一下。可参看:https://segmentfault.com/q/1010000004601135的讨论。


猜你喜欢

转载自blog.csdn.net/qq_41230365/article/details/80321468