【C++】引用可以指向临时无名对象吗?

有如下类定义:
class MyClass{
public:
  MyClass(int d=0): val(d) { }
  ____ //运算符函数+的声明
private:
  int val;
};
若要使语句序列
MyClass x(2), y(4), z;
z=7+y;
y=x+3;
能够正常运行,横线处的声明语句应为()。
A) friend MyClass operator+(MyClass, MyClass);
B) friend MyClass operator+(MyClass&, MyClass&);
C) friend MyClass operator+(MyClass, MyClass&);
D) friend MyClass operator+(MyClass&, MyClass);

【解析】程序中MyClass类给出一个默认构造函数,形参d提整数类型,默认值为0,在成员初始化列表中使用形参d初始化val成员;语句序列中两个表达式:7+y和x+3说明加法运算符函数的两个操作数可以是整型,也可以是MyClass类型,如果是整型的话,需要使用默认构造函数将整数类型隐式转换成临时的MyClass类对象,此时赋给运算符函数时,就不可以使用引用类型了,所以选项B、C、D都是错误的,选项A是正确的。

【个人解析】
  为什么将整型隐式转换成临时的类对象之后,就不能将临时对象的引用传入 “friend MyClass operator+(MyClass&, MyClass&)”?

  因为引用的定义是:定义一个引用时,必须同时进行初始化,使它指向一个已经存在的对象。简单地说,引用必须指向一个“有名”的对象。

  而将整型隐式转换成临时的类对象,这个对象是一个临时“无名”对象,没有名字,当然就使用不了引用了。

  由此可以得出结论:C++中无法定义一个引用指向临时无名对象

  相似的可以联想到,可以使用指针来动态分配内存空间;但是不能使用引用来动态分配内存空间,如:
  MyClass *p=new MyClass; //正确
  MyClass &p=new MyClass; //错误
  究其原因,还是因为C++中,不能定义引用指向“无名”对象。

  下面将题目中的代码补充完整,将错误选项D代入执行看看,编译器是否真的会报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;

class MyClass{
public:
MyClass(int d = 0) : val(d){}
friend MyClass operator + (MyClass&, MyClass);
int Getvalue(){ return val; }
void Changevalue(int a){ val = a; }
private:
int val;
};

MyClass operator + (MyClass &class1, MyClass class2){
MyClass a;
a.Changevalue(class1.Getvalue() + class2.Getvalue());
return a;
}

int main(){
MyClass x(2), y(4), z;
z = 7 + y;
cout << z.Getvalue() << endl;
y = x + 3;

return 0;
}

编译器报错:

————————— 本文结束 感谢您的阅读 —————————
谢谢你请我喝咖啡ლↂ‿‿ↂლ(支付宝扫一扫即可领红包, 消费时可抵现! 你省钱, 我赚钱, 多谢支持~)