我構建了一個名爲CMyString類,這裏是:字符* =新的字符與char * =新的char [N]
class CMyString {
public:
CMyString();
CMyString(char* pData);
CMyString(const CMyString& str);
~CMyString(void);
char* getData();
void setData(char* pData);
CMyString& operator=(const CMyString& str);
private:
char* m_pData;
};
CMyString::CMyString() {
m_pData = new char;
}
CMyString::CMyString(char* pData) {
// m_pData = new char;
m_pData = pData;
}
CMyString::CMyString(const CMyString& str) {
// 爲指針分配內存
// m_pData = new char;
// 拷貝值
m_pData = str.m_pData;
}
CMyString::~CMyString(void) {
// delete m_pData;
}
CMyString& CMyString::operator=(const CMyString& str) {
if (this == &str)
return *this;
delete m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
char* CMyString::getData() {
return m_pData;
}
void CMyString::setData(char *pData) {
m_pData = pData;
}
這裏是我的main.cpp:
#include <iostream>
#include "CMyString.h"
using std::cout;
using std::endl;
int main() {
char* pData = "What are you worrying about?";
std::cout << pData << std::endl;
cout << strlen(pData) << endl;
char* test = new char[30];
cout << sizeof(test) << endl;
char* test2 = new char;
test2 = "23";
cout << test2 << endl;
strcpy(test, pData);
cout << endl << test << endl << endl;
CMyString str(pData);
std::cout << str.getData() << std::endl;
CMyString str2, str3;
str3 = str2 = str;
std::cout << str3.getData() << endl;
char* pData2 = "Data has been changed.";
str3.setData(pData2);
cout << str.getData() << endl;
cout << str2.getData() << endl;
cout << str3.getData() << endl;
return 0;
}
那麼我很困惑的
char* pData = new char;
char* pData2 = new char[30];
我在類的實現嗎? 我怎麼能告訴兩個不同的指針? 我是否正確地編寫構造函數和解構造函數和運算符?如果不是,如何編寫它們?
兩件事:你不想混合'新的char'和'新的char [n]'。它們需要稍微不同的刪除('delete'和'delete []'),並且幾乎不可能從指針中找出使用哪一個。接下來,'char * str =「一個字符串」;'在pre C++ 11代碼中是不好的形式,之後是非法的。 「一個字符串」是一個字符串文字,可以存儲在不可寫入的存儲器中。它應該是一個'const char *'來防止無法寫入的意外程序崩潰寫入int。 – user4581301
您的副本構造函數導致源和副本都指向相同的字符串。一旦你完全實現了析構函數,這很糟糕,因爲它們都會試圖銷燬相同的字符串和其他不好的東西。您將需要分配一個新緩衝區來存放源字符串的副本,然後複製到該緩衝區中。 – user4581301
有用的閱讀:http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom – user4581301