String类(1)

#include <string.h>
#include <iostream>

using std::cout;
using std::endl;

class String
{
public:
    String()//显示定义无参构造函数
    : _pstr(new char[1]())
    {
        strcpy(_pstr,"0");
        cout << "String()" << endl;
    }

    String(const char *pstr)//构造函数
    : _pstr(new char[strlen(pstr)+ 1]()) 
    {
        strcpy(_pstr,pstr);
        cout << "String(const char *pstr)" << endl;
    }

    String(const String & rhs)//拷贝构造函数 深拷贝
    : _pstr(new char[strlen(rhs._pstr)+1]())
    {
        strcpy(_pstr, rhs._pstr);
        cout << "String(const String &)" << endl;
    }

    String & operator=(const String & rhs)//赋值函数
    {
        if(this != &rhs) {//判断是否是自复制
            cout << "String & operator=(const String &)" << endl;
            delete [] _pstr;//回收左操作申请的空间

            //再进行深拷贝
            _pstr = new char[strlen(rhs._pstr) + 1]();
            strcpy(_pstr, rhs._pstr);
        }
        return *this;
    }

    ~String()//析构函数
    {
        if(_pstr)
            delete [] _pstr;

        cout << "~String()" << endl;
    }

    void print()
    {
        printf("pstr = %p\n", _pstr);
        cout << "pstr:" << _pstr << endl;
    }

private:
    char * _pstr;
};

 

为什么要使用 strlen(s) + 1?

在 C 语言中,字符串是以空字符做为终止标记(结束符)的。所以,C 语言字符串的最后一个字符一定是 \0。请确保所有的字符串都是按照这个约定来存储的,不然程序就会因为莫名其妙的错误退出。strlen 函数返回的是字符串的实际长度(所以不包括结尾的 \0 终止符)。所以为了保证有足够的空间存储所有字符,我们需要在额外 +1。如"abc",占四个字节,strlen的值是3

 

为什么+1,sizeof和strlen的区别:
https://blog.csdn.net/Young__Fan/article/details/89478126

posted @ 2019-10-24 16:21  代号870  阅读(180)  评论(0编辑  收藏  举报