天天看点

C++11新特性(53)- 引用限定成员函数

曳光弹类

根据需要的不同,代码也会有所不同。

C++11新特性(53)- 引用限定成员函数

代码除了实现了,构造函数、析构函数以外,还

  1. 实现了setText和output两个方法用于修改内容和输出内容
  2. 重载了+=运算符和+运算符用于对象连接

参照代码

作为后面内容的铺垫,考虑下面的代码:

C++11新特性(53)- 引用限定成员函数

代码中生成了t1,t2连个实例,然后将二者相加并输出。值得注意的是:t1+t2的结果并没有传递给另外的对象而是直接调用output方法,输出结果可以参照下图,主要关注“================“之间的部分。

C++11新特性(53)- 引用限定成员函数

首先创建了一个临时对象,输出以后立刻被销毁。这个对象就是一个右值,通过对右值调用对象方法可以的到正确的输出。如果我们的目的就是输出结果的话,没有任何问题。

上面的例子中对一个右值调用了output方法,看起来很自然,但是调用其他的函数就不一定那么自然了。例如下面的代码对t1+t2的结果调用了setText方法:

C++11新特性(53)- 引用限定成员函数

输出结果如下:

C++11新特性(53)- 引用限定成员函数

虽然setText方法被正常调用,但是这个对象马上被销毁了而无法访问。换句话说这是一段无效代码。相信这也不是程序员的本意。

引用限定符(reference qualifier)

目的很简单,就是希望加一个限制,使得右值对象不能调用setText方法。手段也同样简单,只要在方法签名的后面添加一个“&“,就可以通知编译器,这个函数只对左值(引用)有效。就像下面这样:

C++11新特性(53)- 引用限定成员函数

添加了引用限定以后,下面的代码就会产生编译错误。

C++11新特性(53)- 引用限定成员函数

补充信息

添加引用限定符的位置也是添加const, noexcept的位置,如果需要同时添加的话,引用限定符需要在const之后,noexcept之前。

也可以通过添加“&&”要求方法只对右值使用,但是很抱歉一时没有想到合适的例子。

作者观点

如果需要的是方法执行以后的实例本身,那么就可以使用“&”限定这个方法只对左值对象有效。