String类的设计笔记----C++学习之路

来源:互联网 发布:js从入门到精通 编辑:程序博客网 时间:2024/06/06 14:02

  1.防卫式声明

  2.字符串是大小不固定的,那就是用指针来动态分配内存,用new的方式动态分配一个内存,所以在private中应该是一个char* m_data;

  3.接下来准备构造函数,放在public里,构造函数与class同名。String(const char* cstr=0);给予默认值0;

  4.类内带有指针,就要去考虑三个特殊函数:

拷贝构造(String (const String& str);)  

拷贝赋值(String& operator=(const String& str);)

析构函数(~String();)

  5.取字符串 char* get_c_str() const {return m_data;};

  6.ctor:放在class本体外来写。

    构造函数的步骤:分配空间,转型(编译器),传参。别忘记判断传入的是否有效。

String::String(const char* cstr = 0){    if(cstr)        {             m_data=new char[strlen(cstr)+1];            stcpy(m_data,cstr);        }    else        {            m_data=new char[1];            *m_data='/0';        }}
  7.dtor:放在本体外来写,尽量写上inline

String::~String(){    delete[] m_data;}
  8.copy ctor(拷贝构造)

拷贝构造就是来源端拷贝到目的端,分配空间,再拷贝,代码如下:也希望成为内敛函数,代码没加inline

String::String(const String& str){    m_data=new char[strlen(str.m_data)+1];    strcpy(m_data,str.m_data);}
关于inline什么时候加,什么情况都能加,编译器会自己判断,没有不好的影响。

  9.拷贝赋值

inlineString& String::operator=(const String& str){    if(this==&str)        return *this;    delete[] m_data;    m_data=new char[strlen(str.m_data)+1];    strcpy(m_data,str.m_data);    return *this;}
关于拷贝赋值的返回值,为什么是String&而不是void:假设赋值语句a=b;这句话不管是String&还是void,都是没问题,但是如果是a=b=c;那么就会出错。

以及String&与&str两个&符号的含义,一个是引用,一个是取地址。在我的学习笔记有记录:指针与引用

以及良好的习惯,需要判断是否自我赋值,若没有,不仅是效率问题,也可能会出错。




原创粉丝点击