Vì việc sử dụng cũ của char * không được chấp nhận, bạn có thể không đơn giản sử dụng chuỗi không?
const char* func1() {return "string literal";}
string func2() {return "another string literal";}
Cả hai hoạt động tốt, không có cảnh báo trình biên dịch.
Tuy nhiên
char* func3() {return "yet another string literal";}
sẽ không biên dịch ở tất cả.
"Một chuỗi đen được tĩnh được phân bổ để nó là an toàn để trở lại một từ một chức năng: Cũng sẽ
char* func4() {return &"a ref to a string literal?";}
Stroustrup nói trong "The C++ Programming Language"(Third Edition).
const char* error_message (int i)`
{
//...
return "range error";
}
Việc giữ bộ nhớ lỗi phạm vi sẽ không biến mất sau khi cuộc gọi của error_messages(). "
Vì vậy, mỗi chuỗi ký tự trong một chương trình được cấp phát trong bộ nhớ nhỏ của chính nó kéo dài trong suốt thời gian của chương trình (tức là được phân bổ tĩnh). Đưa const vào trước char * cho phép trình biên dịch biết rằng bạn không có ý định (và không thể) thay đổi đoạn ký tự nhỏ của chuỗi ký tự có thể nguy hiểm, vì vậy chúng cho phép chuyển bài này mặc dù chuyển đổi từ chuỗi ký tự thành char * không được chấp nhận.
Trả về thay cho chuỗi phải sao chép chuỗi ký tự thành một đối tượng thuộc loại chuỗi, bộ nhớ mà người gọi chịu trách nhiệm.
Dù bằng cách nào cũng không có rò rỉ bộ nhớ: mọi chuỗi ký tự đều có phần bộ nhớ riêng được dọn sạch khi chấm dứt chương trình; trở về const char * trả về một con trỏ đến một phần của bộ nhớ của chữ (biết bạn không thể thay đổi nó); và trở về một chuỗi làm cho một bản sao thành một đối tượng chuỗi tồn tại trong mã của người gọi được làm sạch bởi người gọi.
Mặc dù có vẻ như một chút ký hiệu xấu xí, tôi đoán họ đã để lại từ khóa * để giữ giá rẻ thay thế (không có bản sao).
Yêu cầu của bạn trả về 'char *' thay vì 'char const *' có hiệu lực buộc chúng ta giả định rằng một chuỗi ký tự đơn giản sẽ không đủ và do đó 'return" hello world ";' là một giải pháp không hợp lệ. Yêu cầu của bạn về constness là gì? –