简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
#include <iostream>
#include <cstring>
using namespace std;
class MyString
{
public:
MyString(const char*);
MyString(int = 0, char = '\0'); //initialize size_t number of char, terminated with '\0'
MyString(const MyString&); //copy constructor
~MyString(); //destructor
const char* c_str() const; //return private char*
static int getNumberOfObjects();
private:
char *str;
static int numberOfObjects; //count the number of MyString objects
};
int MyString::numberOfObjects = 0;
//deep step
MyString::MyString(const char *inputstr) {
str = new char[strlen(inputstr) + 1];
strcpy(str, inputstr);
numberOfObjects++;
}
//字符串最后一位要自己加空字符
MyString::MyString(int size_t, char a) {
str = new char[size_t + 1];
int i = 0;
for(; i < size_t; i++) *(str + i) = a;
*(str + i) = '\0';
numberOfObjects++;
}
// deep copy step
MyString::MyString(const MyString& _str) {
const char* t = _str.c_str();
str = new char[strlen(t) + 1];
strcpy(str, t);
numberOfObjects++;
}
//delete deep copy
MyString::~MyString() {
// str = 0;
if(str != NULL)
delete []str;
numberOfObjects--;
}
const char* MyString::c_str() const{
return str;
}
int MyString::getNumberOfObjects() {
return numberOfObjects;
}
这里有个比较小的细节,在const char* c_str()这个函数后面要加const。
根据TA的解释,是因为不加const的话会导致
const char* t = _str.c_str();
这里编译错误,因为传进来的参数声明为const MyString& _str,然后我们直接调用了_str这个对象的成员函数c_str(),它非常担心这个成员函数会改变_str的值(虽然这个函数并不会改变_str的值,可是你不把c_str()这个函数声明为const,它不放心调用啊,万一被改了呢)