c++ 深拷贝 函数后加const

来源:互联网 发布:windows 创建快捷方式 编辑:程序博客网 时间:2024/06/16 03:05

        简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!

       

#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 stepMyString::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 stepMyString::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,它不放心调用啊,万一被改了呢)


0 0
原创粉丝点击