C++ 当函数是指针时,对其返回类型的混淆
我编写了以下代码:C++ 当函数是指针时,对其返回类型的混淆,c++,pointers,return-value,C++,Pointers,Return Value,我编写了以下代码: #包括 使用名称空间std; 常量int*myFunction() { int*p=新的int(5); 返回p; } int main() { int*q=myFunction(); 库特 myFunction的返回类型必须与接收其返回值的变量类型完全匹配。(我在这里是否正确?这就是我所理解的。) 否,返回类型不能与变量的类型完全匹配。但必须能够将返回类型隐式转换为变量的类型。 例如,类似这样的内容将编译: int someInt = getMeAFloat(); 如果ge
#包括
使用名称空间std;
常量int*myFunction()
{
int*p=新的int(5);
返回p;
}
int main()
{
int*q=myFunction();
库特
myFunction的返回类型必须与接收其返回值的变量类型完全匹配。(我在这里是否正确?这就是我所理解的。)
否,返回类型不能与变量的类型完全匹配。但必须能够将返回类型隐式转换为变量的类型。
例如,类似这样的内容将编译:
int someInt = getMeAFloat();
如果getMeAFloat
返回一个float
,这将编译,因为float
可以隐式转换为int
(请注意,这会给您一个警告,这是不好的,因为您丢失了float
的额外信息,但我只是想表达我的观点)
您的第一个示例没有编译,因为通常const int*
不能转换为int*
正如user4581301所指出的,第二个示例中的第二个const
并不重要,因为只有返回的指针值被分配给主函数中的指针。第二个const
使指针本身保持不变,这对值没有影响。
这意味着const int*const myFunction()
等于const int*myFunction()
在第二个代码中,q
是一个const int*
-指向const int
”的非常量指针。由于q
本身不是const
,因此可以将其重新分配到一个新地址的点
编译器允许q=&a;
,因为int*
(即&a
返回的内容,因为a
是int
)可以分配给const int*
。换句话说,“指向非常量数据的指针”可以分配给“指向常量数据的指针”,有效地对其他可写数据进行只读访问
反之亦然-不能将“指向常量数据的指针”分配给“指向非常量数据的指针”,因为这将允许对只读数据进行可写访问-这就是第一个代码无法编译的原因。调用方拥有指针的所有权,因此它可以决定指针本身的常量。函数声明中的第二个常量与此无关,因为函数对调用方的var没有任何控制权变量,仅返回数据。请记住,指针只是另一个恰好包含地址的变量。const
或者不,它可以复制到一个非const
变量,这正是这里发生的情况。这类似于const int x=10;int y=x;y=42;
函数返回的类型ing.函数无法知道调用方将对返回值做什么(如果有的话),只能执行这么多。如果接收方确实接受返回值,则由接收方以返回类型支持的方式使用返回值。GCC的-Wall
启用一些警告,但不是所有警告。(在我看来,这面旗帜有点命名错误。)上次我检查时,GCC没有办法使用单个标志启用所有警告,但那是很久以前的事了。请注意,这与强制转换不同,因为强制转换是显式转换。我有一个小疑问。在第一个代码中,在myFunction
的主体内,我们设置了(指针)的类型变量p
作为int*
但在返回时,我们将其更改为const int*
。这让我有点困惑。如何允许我们更改函数头中特定变量的类型?我尝试在函数体内部执行相同的操作,即,我写了以下几行``int*p=new int(5)“;const int*p;```。但是我收到了错误。我试图在主体本身中将类型从int*
更改为const int*
,但是为什么会出现接收错误呢?@相信者请看我在回答相同问题时的其他评论。谢谢。我有一个小疑问。在第一个代码中,在myFunction
的主体内,我们设置了t(指针)变量的类型p
为int*
,但在返回时,我们将其更改为const int*
。这让我有点困惑。如何允许我们更改函数头中特定变量的类型?我尝试在函数体内部执行相同的操作,即,我写了以下几行``int*p=new int(5);const int*p;```。但我收到了错误。我试图在正文本身中将类型从int*
更改为const int*
,但为什么会出现接收错误?@crester“如何允许我们更改函数头中特定变量的类型?”-我在回答中谈到了这一点。int*
可以隐式转换为const int*
,例如:inta;const int*q=&a;
“我试图在函数体中做同样的事情,也就是说,我写了以下几行int*p=new int(5);const int*p;
。但我收到了错误。”-您在同一范围内声明了两个名为p
的变量,您不能这样做。非常感谢。您在给出int*
如何隐式转换为const int*
的示例时,是否错过了int和a之间的*。int*a;const int*q=&a;
@相信者不,我没有。&a
是i当a
为int
时为nt*
,当a
为int*
时为int**
,等等
int someInt = getMeAFloat();