我构建了一个名为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