2011-07-06 26 views
5

Khi xây dựng một std::string từ một const char*, tôi thường sử dụng mô hình sau:thành ngữ đúng cho phân std :: string

const char* p = GetString(); 
std::string s(p); 

Tôi cho rằng tôi có thể sử dụng các mô hình tương tự:

const char* p = GetString(); 
std::string s = p; 

Nhưng , khi tôi muốn chỉ định, thay vì xây dựng, cho một số std::string từ một số const char*, tôi có quá nhiều lựa chọn:

s = p; 
s.assign(p); 
std::string(p).swap(s); 

Có phải các lựa chọn ở trên tương đương nhiều hơn hoặc ít hơn không? Tôi nên thích cái nào hơn và tại sao?

Trả lời

8

Đi để dễ đọc và chỉ sử dụng thành ngữ operator= để gán. Ngoài ra, hãy trực tiếp xây dựng std::string từ const char*.

std::string s(GetString()); 
s = GetString(); 
+3

Ưu tiên s = GetString(); vì điều đó không có cơ hội cho bạn một chức năng ngẫu nhiên (Hầu hết các Vexing Parse - http://en.wikipedia.org/wiki/Most_vexing_parse) – dascandy

1

Hai loại đầu tiên về cơ bản giống nhau; assign có thêm một số tình trạng quá tải cho phép bạn làm những điều thú vị. Tôi sẽ chọn đơn giản =, bởi vì nó rõ ràng hơn.

Bài cuối có vẻ rất dài và không trực quan; Tôi không chắc chắn lý do tại sao bạn sẽ làm điều đó (trừ khi bạn đã tuyệt vọng để đòi lại bộ nhớ mà s đang sử dụng).

2

Toán tử = và .assign khá giống nhau, bạn nên chọn toán tử = form vì nó dễ đọc hơn.

Điều cuối cùng không giống nhau. Trao đổi nội dung không làm giảm lượng thời gian dành cho việc xây dựng một đối tượng cụ thể vì nó không tạo bản sao, nó chỉ di chuyển nội dung xung quanh. Cú pháp của bạn đầu tiên sao chép p thành một chuỗi std :: và sau đó hoán đổi nó với s, mà không phải là bất kỳ biểu diễn nào nhiều hơn phần còn lại khi bạn vẫn sao chép p. Nếu P đã là một std :: string ở một nơi khác mà bạn đã phá hủy anyway, điều này sẽ nhanh hơn.

3

Thông thường, bạn chỉ cần thực hiện

std::string s = GetString();.

Để gán, hãy làm

s = GetString();.

Điều này có nghĩa là đối tượng std::string có thông tin tối đa sẵn có để tạo ra hoạt động nhanh nhất.

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