Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当函数是指针时,对其返回类型的混淆_C++_Pointers_Return Value - Fatal编程技术网

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();