2013-06-03 53 views
11

Trong C truyền thống bạn có thể làm:đúc int để char sử dụng C++ phong cách đúc

int i = 48; 
char c = (char)i; 
//Now c holds the value of 48. 
//(Of course if i > 255 then c will not hold the same value as i). 

nào của C++ phương pháp đúc (static_cast, reinterpret_cast) thích hợp để nhận công việc này thực hiện?

+0

Bạn cũng có thể làm 'char c = i;' và không lo lắng về việc diễn viên nào diễn ra. Tất nhiên, nếu bạn làm điều đó bạn sẽ chạy afoul của "đúc ở khắp mọi nơi" folks người nhấn mạnh rằng cảnh báo trình biên dịch được biến thành lỗi và sau đó cố định bất cứ nơi nào chúng xảy ra. –

Trả lời

8

Bạn ngầm có thể chuyển đổi giữa các loại số, ngay cả khi điều đó mất đi độ chính xác:

char c = i; 

Tuy nhiên, bạn có thể muốn kích hoạt cảnh báo trình biên dịch để tránh chuyển đổi có khả năng mất dữ liệu như thế này. Nếu bạn làm như vậy, hãy sử dụng static_cast để chuyển đổi.

Trong số diễn viên khác:

  • dynamic_cast chỉ hoạt động cho con trỏ hoặc tham chiếu đến các loại lớp đa hình;
  • const_cast không thể thay đổi loại, chỉ const hoặc volatile vòng loại;
  • reinterpret_cast là dành cho các trường hợp đặc biệt, chuyển đổi giữa các con trỏ hoặc tham chiếu và các loại hoàn toàn không liên quan. Cụ thể, nó sẽ không thực hiện chuyển đổi số.
  • phôi kiểu C và kiểu hàm làm bất kỳ kết hợp nào của static_cast, const_castreinterpret_cast là cần thiết để hoàn thành công việc.
+2

'char c = static_cast (i);' –

17

Bạn nên sử dụng static_cast<char>(i) để truyền số nguyên i đến char.

reinterpret_cast hầu như không bao giờ được sử dụng, trừ khi bạn muốn bỏ một loại thành loại cơ bản khác.

Ngoài ra reinterpret_cast phụ thuộc vào máy nên an toàn khi sử dụng nó đòi hỏi sự hiểu biết đầy đủ về các loại cũng như cách trình biên dịch thực hiện dàn diễn viên.

Để biết thêm thông tin về C++ đúc see:

+0

Giả sử, tất nhiên, có một lý do chính đáng để không viết 'char c = '0'' ... – Useless

+0

@Useless Ý nghĩa của điều đó hoàn toàn khác với việc đúc nó từ một int, bạn đặt nó là ký tự' 0 'không giống với số 0. – Kevin

+3

Nhưng giống với số nguyên '48' trong câu hỏi, giả sử mã hóa ASCII. Tôi bị dị ứng với các giá trị số nguyên ASCII mã hóa cứng, khi các ký tự chữ cái vẫn dễ đọc hơn. – Useless

-2

Sử dụng dàn diễn viên tĩnh có lẽ sẽ dẫn đến một cái gì đó như thế này:

// This does not prevent a possible type overflow 
const char char_max = -1; 

int i = 48; 
char c = (i & char_max); 

Để ngăn chặn tràn loại có thể bạn có thể làm điều này:

const char char_max = (char)(((unsigned char) char(-1))/2); 

int i = 128; 
char c = (i & char_max); // Would always result in positive signed values. 

đâu reinterpret_cast có lẽ chỉ trực tiếp chuyển đổi sang char , không có bất kỳ sự an toàn nào. -> Không bao giờ sử dụng reinterpret_cast nếu bạn cũng có thể sử dụng static_cast. Nếu bạn đang truyền giữa các lớp, static_cast cũng sẽ đảm bảo rằng hai loại đó phù hợp (đối tượng là một dẫn xuất của loại diễn viên).

Nếu đối tượng của bạn là loại đa hình và bạn không biết nó là loại nào, bạn nên sử dụng dynamic_cast sẽ thực hiện kiểm tra kiểu lúc chạy và trả về nullptr nếu các loại không khớp.

NẾU bạn cần const_cast, bạn có thể đã làm điều gì đó sai và nên suy nghĩ về các lựa chọn thay thế có thể để sửa chữa tính chính xác của const trong mã của bạn.

0

reinterpret_cast không thể được sử dụng cho chuyển đổi này, mã sẽ không biên dịch. Theo C++ 03 tiêu chuẩn phần 5.2.10-1:

Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.

chuyển đổi này không được liệt kê trong phần đó. Ngay cả điều này không hợp lệ:

long l = reinterpret_cast<long>(i) 

static_cast là loại đã được sử dụng tại đây. Xem các câu hỏi thisthis SO.