2012-03-16 12 views
2

申し訳ありませんが、戻り値なしのC++関数

私はC++で遊んでいました。私は奇妙なことをしていました。

MAIN.CPP

#include <iostream> 
#include "c1.h" 

using namespace std; 

Classe c(){ 
    Classe v(); 
} 
int main(){ 
    cout << c().x; 
    return 0; 
} 

c1.h

#include <iostream> 

using namespace std; 

class Classe{ 

    public: 
     Classe(){ 
      x = 100;; 
    } 
    int x; 
    }; 

だから、私はCを呼び出すことができた理由()関数クラッセのC(){クラッセvは()}戻りいけないX場合変数?

-wallの有無にかかわらず警告はありません。

私はそれをコンパイルいけない機能にVを返さない場合:

main.cppに:機能 'においてクラッセのC()': main.cppに:8:エラー:リターンで エラーメッセージからの変換を非スカラー型 'Classe'への 'Classe(*)()'が要求されました

+3

警告を有効にしてコンパイルを試してください。 gccの '-wall'は' c'から値を返さないことを警告します。 – Thomas

+0

ですが、この機能はどのように機能しますか? (戻り値なしで関数を渡してオブジェクトを作成する) – gaussblurinc

+0

値を返さないと変数xにアクセスできます。 – Lefsler

答えて

2

私はそれが偶然であると思うので、コンパイラはc()が値を返さないことを警告していたはずです。

誤って、関数から値を返すために使用されるレジスタは、その関数内に割り当てられたローカル変数のアドレスでロードされました。

また、関数c()のローカルv()の宣言では、タイプClasseの変数は宣言されていませんが、引数はない関数があり、オブジェクトはClasseです。

1

cは、mainからはるかに離れて定義できる可能性があります。あなたはcコンパイル時にコンパイラの警告を得るでしょう。