2012-02-14 48 views
0

只是想知道是否有不使用const_cast的缺點傳遞一個char *並簡單地將它類型轉換爲(char *)或兩者基本上是同一個?如果我不做const_cast <char*>並簡單地使用(char *)類型轉換,會有什麼壞處嗎?

#include <iostream> 
    #include<conio.h> 
    using namespace std; 

    void print(char * str) 
    { 
    cout << str << endl; 
    } 

    int main() 
    { 
    const char * c = "sample text"; 
    // print(const_cast<char *> (c)); // This one is advantageous or the below one 
    print((char *) (c));    // Does the above one and this are same? 
    getch(); 
    return 0; 
    } 

有沒有使用過print((char *) (c));print(const_cast<char *> (c));基本上都是相同的一些缺點?

+0

我會說'const_cast'更準確地描述了演員的功能。例如,那麼你不能錯誤地認爲你是從一個int進行投射。 – 2012-02-14 19:46:11

+0

@ Zyx2000:所以說:) – 2012-02-14 19:46:30

+0

@VladLazarenko我不小心按下了輸入鍵太早。 – 2012-02-14 19:48:26

回答

8

首先,你的print函數應該採取const char*參數,而不是char*,因爲它不會修改它。這消除了對演員的需求。

至於你的問題,C++風格演員(即const_cast,dynamic_cast等)優於C風格演員,因爲他們表達演員的意圖,他們很容易搜索。如果我不小心使用int類型的變量而不是const char*,則使用const_cast將導致編譯時錯誤。但是,如果我使用C風格的轉換,它將成功編譯,但會在運行時產生一些難以診斷的內存問題。

+0

我沒有在裏面做任何事情,這樣我就可以放置我想知道的東西,而不是讓事情變得冗長並且讓其他用戶看不舒服)。謝謝你的答覆 – Invictus 2012-02-14 19:56:32

3

const_cast是比較合適的,因爲它只擅自拋棄常量性,否則會警告你其他可能出現的錯誤(如一個指針類型轉換成另一種等),以及(char *)將只是默默地解釋什麼,你把它作爲char *。所以,如果你可以 - 更好地使用const_cast更好的類型安全。

5

在此上下文中,它們是相同的(從「const char *」轉換爲「char *」)。 const_cast會的優點是:

  1. 這將有助於捕捉錯別字(如果你不小心投了「常量爲wchar_t *」發送「的char *」,然後的const_cast會抱怨。)
  2. 它更容易搜索。
  3. 這很容易看到。
4

C型鑄(char *)相當於如果使用得當的話。如果你搞砸了const_cast,編譯器會警告你,如果你搞砸C風格的演員,你會得到一個錯誤。

1

獨立於C cast在這種特殊情況下的效果,C cast和C++ cast不一樣:C++區分reinterpret,static,dynamic和const cast。

這些演員的語義是不同的,並不總是同樣可能。

C cast可以是靜態的,也可以是重新解析cast(靜態不可能)。必須在需要這種矛盾的地方使用它(我無法想象如何以及何時),必須避免在需要明確定義和預期的行爲的情況下。

相關問題