2012-05-03 85 views
13

sự khác biệt giữaTrong C++, sự khác nhau giữa static_cast <double> (a) và double (a) là gì?

int a; 
// a gets some value 
double pi = static_cast<double>(a)/3; 

int a; 
// a gets some value 
double pi = double(a)/3; 

Bạn đã bao giờ nhìn thấy sau này là gì? Dường như với tôi tôi thấy nó trong một số đoạn văn được viết bởi Stroustrup nhưng tôi không thể tìm thấy tài liệu tham khảo.

+6

Khi 'a' là' int', 'static_cast (a)', '(double) a' và' double (a) 'đều giống nhau về mặt ngữ nghĩa. Sự khác biệt trở nên rõ ràng khi 'a' là một số loại vô hướng khác, hoặc là' const' hoặc 'dễ bay hơi', v.v. – ildjarn

+0

@ildjarn và từ quan điểm hiệu năng? –

+1

Giống hệt hệt nhau - không có sự khác biệt nào. – ildjarn

Trả lời

10

Ai đó có thể nghĩ rằng họ đang xây dựng thay vì truyền. Hãy xem xét:

some_fun(std::string("Hello")); 

Nhiều người cho rằng họ đang gọi một nhà xây dựng ở đó khi họ đang thực hiện dàn diễn viên kiểu C. Nó chỉ như vậy xảy ra rằng đúc sẽ xem xét các nhà xây dựng của các loại mục tiêu trong danh sách dài của những thứ khác nó nhìn vào và do đó ở đây nó cuối cùng kết thúc lên gọi constructor.

chức năng ký hiệu phôi có tất cả những yếu kém cùng một loại khác của C cast:

  • có thể vô tình bỏ đi constness
  • âm thầm có thể biến thành một diễn giải lại đúc
  • Are khó để phân biệt với grepping công cụ.

Bên cạnh đó, bạn đang thực hiện chính xác cùng một thao tác trong cả hai trường hợp.

1

sử dụng static_cast là kiểu C++ an toàn, nhưng (gấp đôi) - kiểu C cũ không an toàn.

thấy ở đây: Type Casting

7

Sau đó được gọi là các ký hiệu chức năng của đúc rõ ràng nơi bạn một cách rõ ràng nói a phải được coi là một double. Bạn có thể cast bất cứ thứ gì vào bất kỳ loại nào bằng cách sử dụng kỹ thuật này.

Cách thứ nhất là cách ưa thích để truyền loại trong C++. Nó kiểm tra cơ bản để thấy rằng loại bạn đang đúc có ý nghĩa (con trỏ lớp con đến một con trỏ lớp cơ sở, vv). Ngoài ra, như trong ví dụ bạn hiển thị, bạn có thể thực hiện chuyển đổi tiềm ẩn. Về mặt kỹ thuật, static_cast trong ví dụ của bạn là rõ ràng, nhưng kết quả của phép toán (nhiệm vụ) là ngầm định.

3

Không có sự khác biệt về mã lắp ráp được tạo giữa static_cast<double> (a)(double) a. Ưu điểm chính của ký pháp đúc, (type_id) cast_expression, là nó linh hoạt hơn. Trong một tình huống, nó có thể tương đương với một số const_cast, trong một số khác, static_cast, trong một số khác, dynamic_cast, trong một số khác, kết hợp là const_caststatic_cast (hoặc dynamic_cast).

Sức mạnh này cũng là điểm yếu. Ký hiệu đúc nghĩa là những thứ khác nhau ở những nơi khác nhau. Một bất lợi là nó rất dễ dàng để tìm thấy xxx_cast<type_id> (cast_expression). Chỉ cần tìm kiếm _cast. Rất khó để tìm thấy các biểu thức sử dụng ký pháp đúc.

Các vấn đề liên quan