2016-09-22 9 views
-2

目的の変数を再定義:C++ C++での変数の再定義が可能であるならば、私は例えば、思っていた

void some_function(int some_argument) { 
    float some_argument=(float) some_argument; 
    // Do stuff 
    return some_argument; 
} 

これを行うにはいくつかの方法がありますか?あなたが名前を変えることができるのは分かっていますが、名前が同じであれば、はるかにクリーンです。そうでない場合、この機能が含まれていない理由がありますか?

ありがとうございます。

+2

シャドウイングとも呼ばれますが、イニシャライザで古い定義を使用することはできません。 (それは新しいものを使用します) – pmdj

+0

あなたはそれほど多くのクリーナーを意味しますか?新しい名前を付けて、関数のパラメータを無視してください。 – NathanOliver

+0

引数を使うだけではなく、一時的に保存しておきたいのであれば、どうすれば元のものを参照するのでしょうか? – xinaiz

答えて

1

これを実行する方法はありますか?

新しいスコープを作成し、同じ名前の新しい変数を定義して、関数の引数の名前をシャドウすることができます。

void some_function(int some_argument) { 
    { 
     float some_argument = 0; 
     // Do stuff 
    } 
} 

しかし、あなたが使用することはできません。

void some_function(int some_argument) { 
    { 
     float some_argument = (float)some_argument; 
     // Do stuff 
    } 
} 

を第2のケースでは、初期化は、シャドウイングの変数を初期化するために、関数の引数を使用しません。変数と引数に異なる名前を使用して

  1. int i = i; 
    

    は、すべてのこれらの激論を避けるように悪いです。

    void some_function(int some_argument_in) { 
        float some_argument = (float)some_argument_in; 
        // Do stuff 
    } 
    
  2. 関数のオーバーロードを使用する。

    void some_function(float some_argument) { 
        // Do stuff 
    } 
    
    void some_function(int some_argument) { 
        some_function((float)some_argument); 
    } 
    
+0

良い答え。変数のシャドーイングに以前の値を使用できない理由はありますか?同じ範囲でシャドーイングできない理由はありますか?私はオーバーロードが好きだった、それはこれまでのところきれいだった。私が頻繁に関数を呼び出すと、オーバーロードがパフォーマンスに影響しますか?どうもありがとう。 – negamartin

0

以下は、intfloat間の変換データの損失の可能性について警告を与えるが、それはあなたが一種類として変数を渡し、別としての機能で作業することができます方法を示しています。

float some_function(int some_argument) { 
    // Do stuff 
    return some_argument; 
} 

int main() 
{ 
    float oldval = 3; 
    float newval = some_function(oldval); 
    return 0; 
} 
+0

新しいタイプを暗黙的にキャストすることができますが、これは私の場合ではありません。申し訳ありませんが私は質問でそれをカバーしていませんでした。 – negamartin

+0

[ユーザー定義の変換](http://en.cppreference。com/w/cpp/language/cast_operator)を使用して、この機能やその他の機能のコードをきれいに保つことができます。 – wally

+0

ああ、それは素晴らしい方法ですが、それは機能の外部環境を汚染するようなものです。 – negamartin

関連する問題