string深刻认识

来源:互联网 发布:oracle导出数据库脚本 编辑:程序博客网 时间:2024/05/29 14:43

        string的本质其实是个类,而char十个内建类型 不属于类。其次在初始化的时候,一点要注意string不可以设置为null,(如果你以前习惯 char * str = null),这是因为string的赋值函数的实现会直接传入进入 调用这个null的内部变量出错。大家可以看如下代码

  1.  String & String::operate =(const String &other)  
  2.  {     
  3.   
  4.          // (1) 检查自赋值  
  5.   
  6.          if(this == &other)  
  7.   
  8.              return *this;  
  9.   
  10.           
  11.   
  12.          // (2) 释放原有的内存资源  
  13.   
  14.          delete [] m_data;  
  15.   
  16.           
  17.   
  18.          // (3)分配新的内存资源,并复制内容  
  19.   
  20.      <span style="white-space:pre"> </span>int length = strlen(other.m_data);  
  21.   
  22.      <span style="white-space:pre"> </span>m_data = new char[length+1];  
  23.   
  24.         strcpy(m_data, other.m_data);  
  25.   
  26.           
  27.          // (4)返回本对象的引用  
  28.          return *this;  
  29. }
int length = strlen(other.m_data); 执行这句话为错,所以初始化可以什么都不写,如string str。就执行如下代码

   

  1. String::String(const char *str)  
  2. {  
  3.        if(str==NULL)  
  4.        {  
  5.            <span style="white-space:pre">   </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空  
  6.                                      //加分点:对m_data加NULL 判断  
  7.            <span style="white-space:pre">   </span>*m_data = '\0';  
  8.        }      
  9.        else  
  10.        {  
  11.         <span style="white-space:pre">  </span>int length = strlen(str);  
  12.         <span style="white-space:pre">  </span>m_data = new char[length+1]; // 若能加 NULL 判断则更好  
  13.         <span style="white-space:pre">  </span>strcpy(m_data, str);  
  14.        }  
  15. }  
  16.   

       默认的情况下string定义const char * str = NULL

       所以会执行if, 这里面会涉及内存开辟已经完成,没有内存可以分配情况

      

  1.  {  
  2.            <span style="white-space:pre">   </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空  
  3.                                      //加分点:对m_data加NULL 判断  
  4.            <span style="white-space:pre">   </span>*m_data = '\0';  
  5.        }      

              这里面可以写成

  1.  {  
  2.            <span style="white-space:pre">   </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空  
  3.                                      //加分点:对m_data加NULL 判断  
  4.      if(m_data != NULL)
  5.      {
  6.            <span style="white-space:pre">   </span>*m_data = '\0';
  7.      }  
  8.  }      
               


0 0
原创粉丝点击