2013-03-13 81 views
7

Tôi cần phải tạo một chuỗi gồm 100 A ký tự.C++ 11 khởi tạo chuỗi

Tại sao sau

std::string myString = {100, 'A'}; 

cho kết quả khác nhau hơn

std::string myString(100, 'A'); 

?

+1

Đối khởi phổ quát, chỉ cần thay thế '()' bằng '{}'. Bạn nên làm 'std :: string myString {100, 'A'}; ' –

+1

@CrazyEddie nhưng đây là một ví dụ về nơi mà thay đổi trong ngoặc sẽ thay đổi hoàn toàn hành vi của chương trình. Phương thức khởi tạo 'initializer_list' được ưu tiên hơn tất cả các hàm khác. Dấu '=' không có sự khác biệt ở đây. [Xem demo] (http://ideone.com/VxAQUY). – juanchopanza

+1

@CrazyEddie Điều đó tạo sự khác biệt như thế nào? Kết quả vẫn không giống như 'std :: string myString (100, 'A'); ' – Praetorian

Trả lời

14
std::string myString = {100, 'A'}; 

là khởi tạo bằng danh sách bộ khởi tạo. Nó tạo ra một chuỗi với 2 nhân vật: một với mã 100 và 'A'

std::string myString(100, 'A'); 

gọi constructor sau:

string (size_t n, char c); 

mà tạo ra một chuỗi 100 'A của

+5

Chính thức, đối số đầu tiên chỉ đơn thuần là 'char' với giá trị 100; đó là ASCII nếu hệ thống của bạn xử lý các giá trị 'char' như ASCII. Trong khi đó là khá phổ biến, nó không được yêu cầu bởi định nghĩa ngôn ngữ C++, và có những hệ thống mà nó không đúng. –

+0

@ Fanael - Tôi không biết nó cứng như thế nào, nhưng đó là một điểm quan trọng thường bị bỏ qua và chỉ chỉnh sửa văn bản không nhắc nhở mọi người về nó. –

+0

@PeteBecker: Điều đó có nghĩa là 'std :: string s = {100, 'A'}; 'là hành vi không xác định? Điều đó sẽ không làm mất hiệu lực phần lớn ý định tạo cú pháp khởi tạo đồng bộ trong C++ 11? –

1

Giá trị đầu tiên khởi tạo giá trị là 100 và A và lệnh thứ hai gọi quá tải của hàm tạo là std::string.

+3

Có, hàm tạo đó sẽ cung cấp cho bạn chuỗi ký tự có ký tự 100 '' A''. – juanchopanza

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