[英]return type in c++
#include<iostream>
int & fun();
int main()
{
int p = fun();
std::cout << p;
return 0;
}
int & fun()
{
int a=10;
return a;
}
为什么该程序在第6行没有给出“从int *到int的无效转换”的错误,因为在我们这样做时会发生这种情况?
int x = 9;
int a = &x;
int&
是一种类型; 它的意思是“对int
的引用”。
&x
是一个表达式; 它的意思是“取x
的地址”。 一元&
运算符是地址运算符。 它采用其参数的地址。 如果x
是一个int
,则&x
的类型是“一个指向int
的指针”(即int*
)。
int&
和int*
是不同的类型。 引用和指针在许多方面都相同。 也就是说,它们都引用对象,但是它们的用法却大不相同。 一方面,引用隐式地引用了一个对象,并且不需要间接访问引用的对象。 需要显式间接(使用*
或->
)以获取指针引用的对象。
&
这两种用法完全不同。 它们也不是唯一的用途:例如,还有执行位和运算的二进制&
运算符。
还要注意,您的函数fun
不正确,因为您返回了对局部变量的引用。 函数返回后, a
被销毁并不再存在,因此您永远无法使用从函数返回的引用。 如果您确实使用它,例如,像您一样将fun()
的结果分配给p
,则行为是不确定的。
从函数返回引用时,必须确保在函数返回后该引用所引用的对象将存在。
为什么该程序在第5行没有给出“从int *到int的无效转换”的错误,因为在我们这样做时会发生这种情况?
那是因为您试图通过引用而不是地址返回变量。 但是,您的代码将调用Undefined Behavior,因为返回对局部变量的引用然后使用结果是UB。
因为在一种情况下它是一个指针,而在另一种情况下是一个引用:
int a =&x表示将a设置为x的地址-错误
int&p = fun()意味着将p设置为对int的引用-好的
C ++中的函数与宏不同,即,当您对int p = fun()
qrite时,它不会变为int p = &a;
;。 (我想这就是您对问题的期望)。 您正在做的是从函数f
返回引用 。 您无处不在任何变量的地址。 顺便说一句,当您返回对局部变量的引用时,以上代码将调用不可侵犯的行为。
您不返回int *
,而是重新调整int &
。 也就是说,您将返回对整数的引用,而不是指针。 该引用可能会衰减为一个int
。
尽管它们都使用“&”符号,但它们是两个不同的东西。 在第一个示例中,您将返回对int的引用 ,该引用可分配给int。 在第二个示例中,您试图将x(指针)的地址分配给int,这是非法的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.