您的位置:首页 > 其它

string深刻认识

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

String & String::operate =(const String &other)

{

// (1) 检查自赋值

if(this == &other)

return *this;

// (2) 释放原有的内存资源

delete [] m_data;

// (3)分配新的内存资源,并复制内容

<span style="white-space:pre"> </span>int length = strlen(other.m_data);

<span style="white-space:pre"> </span>m_data = new char[length+1];

strcpy(m_data, other.m_data);

// (4)返回本对象的引用

return *this;

}

int length = strlen(other.m_data);
执行这句话为错,所以初始化可以什么都不写,如string str。就执行如下代码

String::String(const char *str)

{

if(str==NULL)

{

<span style="white-space:pre"> </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空

  //加分点:对m_data加NULL 判断

<span style="white-space:pre"> </span>*m_data = '\0';

}

else

{

<span style="white-space:pre"> </span>int length = strlen(str);

<span style="white-space:pre"> </span>m_data = new char[length+1]; // 若能加 NULL 判断则更好

<span style="white-space:pre"> </span>strcpy(m_data, str);

}

}

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

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

{

<span style="white-space:pre"> </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空

  //加分点:对m_data加NULL 判断

<span style="white-space:pre"> </span>*m_data = '\0';

}

这里面可以写成

{

<span style="white-space:pre"> </span>m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志'\0'的空

  //加分点:对m_data加NULL 判断

if(m_data != NULL)

{

<span style="white-space:pre"> </span>*m_data = '\0';

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: