String::String( void )
{
m_str_data = new char[1];
m_str_data[0] = '\0';
}
String::String( const char* str )
{
if ( str == NULL )
{
m_str_data = new char[1];
m_str_data[0] = '\0';
}
else
{
int nc_len = strlen( str );
m_str_data = new char[ nc_len + 1 ];
memcpy( m_str_data , str , nc_len * sizeof( char ) );
m_str_data[nc_len] = '\0';
}
}
String::String( const String& obj )
{
int nc_len = strlen( obj.m_str_data );
m_str_data = new char[ nc_len + 1 ];
memcpy( m_str_data , obj.m_str_data , nc_len * sizeof( char ) );
m_str_data[nc_len] = '\0';
}
String::~String( void )
{
if ( m_str_data )
{
delete[] m_str_data;
m_str_data = NULL;
}
}
String& String::operator =( const String& obj )
{
if ( this == &obj )
{
return *this;
}
if ( m_str_data )
{
delete []m_str_data;
m_str_data = NULL;
}
int nc_len = strlen( obj.m_str_data );
m_str_data = new char[ nc_len + 1 ];
memcpy( m_str_data , m_str_data , nc_len * sizeof( char ) );
m_str_data[nc_len] = '\0';
return *this;
}
//假定String类已经定义了构造函数和拷贝构造函数等,都按深度复制的规范
String strTest = "abc"; //构造函数 使用new运算符 new char
vector<String> vec;
vec.push_back( strTest ); //push_back参数是引用型,如果是值的话那又会产生一个string的临时对象
//函数内部生成一个对象会调用 拷贝构造函数 new char
//stl内部为它管理的对象分配内存使用内存池 调用::operator new(size_t)来产生大块内存
//String对象在vertor的内存池中分配内存 使用plmentnew
如果不是自己定义的String,而是使用stl中的string,则结局又不一样。
string为小字符串使用数组形式的栈内存
union _Bxty
{ // storage for small buffer or pointer to larger one
_Elem _Buf[_BUF_SIZE];
_Elem *_Ptr;
} _Bx;
注意stl中的string使用写时复制