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;
- }
- 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';
- }
- }