簡體   English   中英

關於C ++中的static_cast

[英]About static_cast in c++

我正在閱讀http://www.gotw.ca/gotw/036.htm (它是關於直接初始化和復制初始化的),它的提法如下:

static_cast<S>(t); // performing a static_cast

static_cast使用直接初始化。

有人可以解釋為什么static_cast和為什么需要使用初始化嗎? 我以為轉換只是重新解釋給定存儲位置中的位...

reinterpret_cast重新解釋這些位。 static_cast是語義感知轉換。 它將嘗試找到將值從一種類型轉換為另一種類型的明智操作,如果不能將其編譯失敗。

明智的操作是在各種整數和浮點類型之間進行轉換(可能是截斷),自動轉換為bool,將bool轉換為數字等。此外,還可以使用用戶定義的轉換運算符和單參數構造函數在用戶之間進行轉換。定義的類型。 在使用構造函數的情況下,它使用直接初始化,因此可以使用顯式構造函數,這與隱式轉換不同,后者不能。

static_cast在類層次結構中執行查找以強制轉換為正確的類,它不會重新解釋這些位(即reinterpret_cast)。

dynamic_cast發生相同的事情,不同之處在於static_cast在編譯時完成,而dynamic_cast在運行時完成。

以以下示例為例:A:B,A:C,D:B,C

下面的代碼將打印出指針指向另一個內存塊

{
  D *ptrToD = new D();
  C *ptr1 = static_cast<C>(ptrToD);
  C *ptr2 = reinterpret_cast<C>(ptrToD);
  if (ptr1==ptr2)
  {
     printf("Pointers point to the same memory block");
  } else
  {
     printf("Pointers point to different memory blocks");
  }
}

如果您看一下內存,它將看起來像ABACD

如果要將其強制轉換為C,則C從D開頭+ sizeof(B)(AC)開始,而A和B從與D相同的內存塊開始。

也許這不是一個完全說明性的示例,但請注意以下內容

void f(double **arg) {} // just to make a point

int main() {
    double d(1.);
    double *pd = &d;
    double const *cpd = &d;

    f(&pd); // OK 
    f(&(const_cast<double*>(cpd))); // Error
}

產生的錯誤是

錯誤C2102:&需要左值

從它們返回必須綁定到變量的r值的意義上說,static_cast的行為方式相同。 就是那個被初始化的變量

我以為轉換只是重新解釋給定存儲位置中的位...

不,強制轉換執行類型轉換。 在這種情況下,它將t轉換為S類型; 這樣的轉換是可能的,因為T繼承自S ,因此可以通過復制t那一部分來制作新的S 像這樣復制基礎子對象有時也稱為切片

有人可以解釋為什么static_cast和為什么需要使用初始化嗎?

類型轉換需要創建新類型的(臨時)對象。 該對象需要初始化, static_cast的規則指定它使用直接初始化 由於S是類類型,因此這意味着通過調用適當的構造函數進行初始化-在本例中為隱式聲明的copy構造函數,該構造函數通過復制tS子對象來初始化對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM