繁体   English   中英

在C ++中返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM