2013-05-08 35 views
9

Khi tôi chuyển đổi một char*-std::string sử dụng constructor:C++: Có char con trỏ để std :: string chuyển đổi sao chép nội dung?

char *ps = "Hello"; 
std::string str(ps); 

Tôi biết rằng container std có xu hướng để sao chép giá trị khi họ được yêu cầu lưu trữ chúng. Toàn bộ chuỗi có được sao chép hoặc chỉ con trỏ không? nếu sau đó tôi str = "Bye" sẽ thay đổi ps để trỏ đến "Tạm biệt"?

+0

họ có các toán tử gán quá tải và thực sự nếu tôi đoán chính xác chúng sẽ sử dụng thuật toán sao chép và hoán đổi. và một đối tượng chuỗi tạm thời sẽ được tạo từ char *. –

+2

@Koushik: bạn đang đoán sai. Tạo một bản sao nông ở đây sẽ phản trực giác và dễ bị lỗi. –

+0

@VioletGiraffe có tôi nhận ra con trỏ không được sao chép và có một bản sao sâu và cần có một bộ đệm nội bộ để giữ điều này. –

Trả lời

20

std::string đối tượng sẽ cấp phát bộ đệm trong và sẽ sao chép chuỗi được trỏ tới bởi ps tại đó. Các thay đổi đối với chuỗi đó sẽ không được phản ánh vào bộ đệm ps và ngược lại. Nó được gọi là "bản sao sâu". Nếu chỉ bản thân con trỏ được sao chép chứ không phải nội dung bộ nhớ thì nó sẽ được gọi là "bản sao nông".

Để nhắc lại: std::string thực hiện sao chép sâu trong trường hợp này.

3

str sẽ chứa một bản sao của ps, thay đổi str sẽ không thay đổi ps.