非void函数缺少return语句的返回值是多少?

时间:2018-12-23 14:13:09

标签: c++

我有一个简单的函数,它充当指向对象的指针的吸气剂

public class WebViewAppApplication extends BaseApplication {
    @Override
    public void onCreate() {
        super.onCreate();

        // init logcat
        Logcat.init(WebViewAppConfig.LOGS, "WEBVIEWAPP");

        // init analytics
        FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(!WebViewAppConfig.DEV_ENVIRONMENT);

        // init AdMob
        MobileAds.initialize(this, WebViewAppConfig.ADMOB_APP_ID);
    }

    @Override
    public String getPurchaseCode() {
        return WebViewAppConfig.PURCHASE_CODE;
    }

    @Override
    public String getProduct() {
        return Kozuza.PRODUCT_WEBVIEWAPP;
    }

我忘了在上述简单函数中编写return关键字,并对其进行了编译并成功运行。

然后我发现缺少一个return关键字,因此我启动GDB试图了解它是如何工作的,我发现该函数实际上返回了所需的指针。


实验#1

我尝试了更简单的示例

wxAuiNotebook* Frame::GetNoteBook(unsigned short index)
{
    NotebooksContainer->GetBook(index);
}

GCC编译器在编译过程中不会引发错误,但是对象的地址完全不同。 在G ++ 4.3.3下获得了以下输出

class A {
private:
    std::string* pstr;
public:

    std::string* GetPstr()
    {
        std::cout << pstr << std::endl;
        pstr;
    }

    void SetPstr(std::string* val)
    {
        pstr = val;
    }

};

int main() {

    A a;
    std::string jfox("This is Jumping Fox");
    a.SetPstr(&jfox);
    std::cout << a.GetPstr() << std::endl;
    return 0;
}

注意:同一简单示例在MSVC 2015下引发错误。


据我所知,有些语言-例如。 Ruby-将函数的最后一条语句的结果作为返回值返回,但这不适用于C ++。

为什么在原始示例中返回相同的指针,以及在简单示例中为何返回不同的指针呢?

我愿意接受更多实验。

1 个答案:

答案 0 :(得分:3)

这是未定义的行为。在许多情况下,它看起来像在工作,因为要返回的值位于预期的位置(例如x86 / x64上的CPU寄存器EAX),但这是一个巧合,您不能依靠任何东西。