2016-09-22 82 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 
    } 
} 

在第二種情況下,初始化不使用函數參數初始化陰影變量。它是那麼糟糕,因爲

int i = i; 

通過避免所有這些麻煩:

  1. 的變量和參數使用不同的名字。

    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