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';
}
}
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';
}
}
相关文章推荐
- Java常考面试题7 深刻认识String、StringBuilder、StringBuffer
- String 源码解析,深入认识String
- 认识String之一:比较String
- 一道印象深刻的面试题:String参数传递问题
- Scala 之 认识Multiline String与String的stripMargin妙用
- 深刻认识form
- synchronized的深刻认识
- 深刻认识木马
- 深刻理解Java中的String、StringBuffer和StringBuilder的区别
- 深刻认识OpenStack
- 深刻认识差模电压和共模电压
- 对 PHP SESSION 的深刻认识(四)---- 缓存(memcache和redis)存储session
- 项目后台的最新认识和对MVC封装性、可维护性的更深刻认识!
- Android:认识R类、findViewById方法查找组件、@string查找字符、@color查找颜色、@drawable查找图片、@dimen某个组件尺寸定义、项目引入资源国际化
- 深刻认识clientX,offsetX,screenX
- 关于System.String的几个认识
- 黑马程序员-————学完String后的一点认识。
- NSMutableString的基础认识和使用
- Java常考面试题8 深刻认识JAVA重载和重写 以及是否可以根据返回类型来区分重载
- 简单而又深刻的认识:原码、补码、反码