Trong C++, chữ số 0
có loại int. Bạn không thể thay đổi bất cứ điều gì về nó là một số nguyên, mà không cần thêm ít nhất một dấu thập phân. (Không cần phải thực tế để viết chữ số sau dấu mặc dù)
Để trả lời bạn câu hỏi tiềm ẩn liên quan đến lý do tại sao gọi là rõ ràng với 123
nhưng mơ hồ với 0
:
Khi bạn khởi tạo A
, nó là tốt vì không có chuyển đổi ngầm từ một int đến một con trỏ (char*
, trong trường hợp này).
Khi bạn khởi tạo C
sử dụng một int lần thứ hai, bạn sử dụng 0
, các literal 0
có thể được ngầm chuyển đổi sang một con trỏ (một số hành vi di sản, trước khi C++ 11 cung cấp nullptr
đen).
Vì vậy, trong một nutshell:
int * a = 0; // legal;
int * b = 2; // ILLEGAL;
Khi khởi C
một chuyển đổi là cần thiết để cung cấp cho các lập luận để bất kỳ của hai nhà xây dựng sẵn (và cả hai chuyển đổi có bảng xếp hạng tương tự), cuộc gọi là mơ hồ.
Để làm cho nó rõ ràng, bạn nên đúc chữ cái của bạn thành chữ gấp đôi ((double)0
), sử dụng chữ kép (0.
) hoặc thêm một hàm tạo tham số. Với giải pháp cuối cùng này, hàm tạo tham gia int
là kết hợp chính xác, do đó, kết hợp tốt hơn là quá tải khác cần chuyển đổi (đó là lý do tại sao nó được chọn).
Chỉnh sửa. Xin lưu ý rằng Câu trả lời TartanLlama phải được chấp nhận ở đây vì đây là thực hành C++ tốt nhất: hàm tạo sử dụng chuỗi kiểu C phải thay thế std::string
.Kể từ khi có một chuyển đổi ngầm từ chuỗi C-style để std::string
, cuộc gọi sẽ làm việc với sự thay đổi nhỏ:
Var B("abc");
Nhưng bạn sẽ cô lập giao diện lớp học của bạn từ gợi ý chi tiết.
Nguồn
2015-06-22 14:13:32
Bạn đã thử thêm một hàm tạo chấp nhận một 'int', gọi phương thức' double'-constructor chưa? – Caramiriel
Trong 'C++',' 0' có thể là số nguyên * không * hoặc * con trỏ rỗng *. Tiêu chuẩn 'C++ 11' gần đây bằng cách giới thiệu từ khóa' nullptr' cho con trỏ * null *. – Galik
@Galik: Sắp xếp. Nó vẫn đúng là '0' là mơ hồ. –