2013-02-04 72 views
5

Nếu tôi không sửa đổi một chuỗi thì đó là tùy chọn đầu tiên tốt hơn hoặc là giống nhau - (Tôi chỉ muốn lặp qua chuỗi, nhưng vì kích thước chuỗi lớn nên tôi không muốn sao chép cục bộ .)chuỗi dưới dạng tham số?

int getString(string& str1) { 
    //code 
} 


int getString (string str1) { 
    //code 
} 

Và nếu tôi có kế hoạch thay đổi chuỗi, thì có sự khác biệt nào giữa hai loại này không? Có phải vì các chuỗi không thay đổi trong C++?

+2

Chuỗi không thay đổi trong C++. Nếu bạn không cần phải sửa đổi nó, chỉ cần vượt qua tham chiếu const. – chris

Trả lời

7

Chuỗi ký tự không thay đổi, std::string s thì không.

Đầu tiên là tham chiếu chéo. Nếu bạn không có kế hoạch sửa đổi chuỗi, hãy chuyển nó qua tham chiếu const.

Thứ hai là giá trị theo giá trị - nếu bạn sửa đổi chuỗi bên trong hàm, bạn chỉ đang sửa đổi một bản sao, do đó, nó là tranh luận.

+0

vì vậy nếu tôi vượt qua bằng cách tham chiếu và thay đổi chuỗi, chuỗi gốc sẽ được thay đổi? không phải là một bản sao, không giống như java? – ofey

+0

@ofey - vâng, nhưng lần trước tôi sử dụng Java, tôi khá chắc chắn rằng các loại lớp (nghĩa là các loại không phải cơ bản) cũng được chuyển bởi tham chiếu, chứ không phải giá trị. Nó có thể là một sự khác biệt giữa 'string' và' String' trong Java mặc dù. – slugonamission

+0

@slugonamission vì vậy nếu tôi muốn thay đổi một chuỗi lớn và tôi không quan tâm đến việc lưu giá trị ban đầu của nó, tôi nên vượt qua nó bằng cách tham chiếu và không có bản sao cục bộ sẽ được thực hiện? – ofey

9

Tại sao bạn không vượt qua tham chiếu const? Bằng cách này, bản sao sẽ không được thực hiện, cũng như chức năng gọi là không thể sửa đổi chuỗi.

int getString(string const &str1) 
{ 
} 
2

Có, sẽ có sự khác biệt.

Các biến thể thứ hai (không có &) sẽ sao chép chuỗi giá trị vào phạm vi của getString chức năng. Điều này có nghĩa là mọi cập nhật bạn thực hiện sẽ ảnh hưởng đến bản sao cục bộ, không ảnh hưởng đến bản sao của người gọi. Điều này được thực hiện bằng cách gọi hàm tạo bản sao của lớp với giá trị cũ (std::string(std::string& val)). Mặt khác, biến thể đầu tiên (với số &) chuyển qua tham chiếu, do đó thay đổi biến cục bộ sẽ thay đổi biến số của người gọi, trừ khi tham chiếu được đánh dấu là const (trong trường hợp này, bạn không thể thay đổi giá trị) . Điều này nên nhanh hơn vì không cần thao tác sao chép nếu bạn không thay đổi chuỗi.

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