[英]String Class C++
假設我想編寫自己的字符串類。 該字符串具有char * s
屬性,該屬性是指向字符的指針。
現在在構造函數String::String()
,您將傳入什么以假定另一個char *
? 您實際上不能做類似下面的代碼的事情,因為兩個指針都指向同一件事(我們不希望這樣):
String::String(const char *str) {
s = str;
}
任何幫助表示贊賞!
您需要深度復制字符串,即創建足夠長的字符緩沖區以合並str
的內容,然后將內容復制到其中。 最簡單的方法是使用
strdup
strcpy
,因為前者是非標准的:
s = new char[strlen (str) + 1];
if (s == NULL) throw some_exception;
strcpy (s, str);
請不要編寫自己的字符串類。 您必須知道很多細節,不要引入錯誤(例如,重載運算符,布爾習語等),還有許多細節可以使該字符串類高效(例如,實現寫時復制)等等。但是僅出於教育目的,您必須復制所傳遞的字符串。 這是一個例子:
#include <cstdint>
#include <cstring>
#include <cstdio>
class String
{
char *p_;
public:
explicit String (const char *str)
{
auto length = std::strlen (str) + 1;
p_ = new char [length];
std::memcpy (p_, str, length);
}
~String ()
{
delete [] p_;
p_ = nullptr;
}
inline const char *c_str () const
{
return p_;
}
};
int
main ()
{
String s ("Hello, world!");
std::printf ("%s\n", s.c_str ());
}
您應該復制作為參數傳遞的以空終止的字符串的內容。
一件事是您可能會刪除終止null,因為如果您擁有自己的類,則可以通過保持當前長度來手動管理字符串邊界。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.