【发布时间】:2018-10-18 20:31:00
【问题描述】:
我正在尝试一些东西,我做了这个代码:http://cpp.sh/4x435 (如下图所示)
#include <iostream>
using namespace std;
class Thing{
public:
int height;
Thing(int h): height(h) {};
Thing(): height(10) {};
~Thing(){};
int display(){ return this->height; }
};
Thing* get(){
Thing* x = new Thing(33);
}
int main(){
Thing* a = new Thing();
std::cout<<"1: "<<a->display()<<std::endl;
a = get();
std::cout<<"2: "<<a->display()<<std::endl;
return 0;
}
在编译和运行它之前,我忘记在“get”函数中添加一个返回值,令人惊讶的是它无论如何都正确播放(即“1:10, 2:33”是输出)。
现在我看到在线 shell 中它只显示“1:10”,而当我尝试让它按值返回一个 int 或字符串时,如下所示:
int get(){ int a = 30; }
int main(){
int b = get();
std::cout<<"1: "<<b<<std::endl;
return 0;
}
它不能正常工作(输出“1:1”),这是意料之中的。
那里发生了什么? “Things* get()”不应该出现故障、导致错误或至少让它在屏幕上吐出一些乱码之类的东西吗?
我正在使用 Code::Blocks 16.01、C++11、GNU GCC 编译器,没有设置额外的标志(所以只有 Code::Blocks 已经设置的标志)
编辑:
这与建议的重复不完全相同,因为int get() { int a = 30; } 的示例返回 1,如果它返回 30,那么就会出现同样的问题。
但是,我尝试了这个:
int* get(){
int* x = new int(4);
}
int main(){
int* a;
a = get();
std::cout<<"2: "<<*a<<std::endl;
return 0;
}
在这里,我遇到了在尝试get() 的返回类型为Thing* 的代码的第一个版本时发现的相同问题。所以它似乎与指针有关。
【问题讨论】:
-
为什么 get() 函数不返回任何东西?
-
@Abra001 OP 已经在问题中解决了这个问题:“我在编译和运行它之前忘记在“get”函数中添加一个返回值”。被问到的问题是为什么编译器或运行时没有捕获到这个错误(被遗忘,即省略返回)
-
@Mgetz 不完全是。我在“它无法正常运行(输出“1:1”)中解释了这种情况,这是意料之中的。”,我认为这是缺少重要关键字的逻辑结果,即它在输出中向我展示了一些东西,所以我可以看到它没有做我想要的。但是如果“int get()”返回 30,那么这将是同样的问题。 “Thing”对象无论如何都返回了正确的结果,这让我感到惊讶。
-
@JackOfBlades 它返回的东西恰好是您认为正确的东西,但也很容易成为您认为不正确的东西。输出完全不足为奇,但事实上您碰巧认为它是正确的。如果你不再认为它是正确的,那么谜团就会消失。鉴于您提供的代码,该实现做了一些您不会期望的事情——这正是您应该期望的。
标签: pointers return codeblocks