#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;
class String
{
public:
//String():str(NULL){std::cout<< "String()"<<std::endl;}; // 1 Sting s; 走这里
//String(const char* pStr); // 2 Sting s(str); 走这里
String(const char* pStr = NULL); // 3 这个声明是与 1 有冲突的,应为都是 可以无参传入,所以有问题, Sting s; Sting s(str);都是走这里
String(String&);
String& operator=(const String&);
String& operator+(const String&); //cat
~String();
void print(void);
private:
char* str;
};
String::String(const char* pStr)
{
//unsigned int strLen;
if(pStr == NULL)
{
std::cout<< "fun = " <<__FUNCTION__<< ", line = " << __LINE__ <<std::endl;
String::str = new char;
*String::str = '\0';
}
else
{
std::cout<< "fun = " <<__FUNCTION__<< ", line = " << __LINE__ <<std::endl;
//strLen = strlen(pStr)+1;
//String::str = new char[strLen];
String::str = new char[strlen(pStr)+1];
strcpy(String::str, pStr);
//memcpy(String::str, pStr, strLen);
}
}
String::~String()
{
std::cout<< " ~String() " <<std::endl;
if(str) delete[] String::str;
}
String::String(String& tStr)
{
std::cout<< " copy construct " <<std::endl;
String::str = new char[strlen(tStr.str)+1];
assert ( String::str != NULL );
strcpy(String::str, tStr.str);
}
String& String::operator+(const String & src)
{
std::cout<< " operator + " <<std::endl;
int len = strlen(src.m_str) + strlen(m_str) + 1;
char* str = new char[len];
assert ( str != NULL );
memset(str,0,sizeof(char)*len);
strcpy(str,m_str);
strcpy(str+strlen(m_str), src.m_str);
if ( m_str != NULL)
{
delete[] m_str;
}
m_str = str;
return *this;
}
void String::print(void)
{
std::cout<< "str = " << "\"" << str << "\"" <<std::endl;
}
String& String::operator = (const String & object)
{
std::cout<< " operator = " <<std::endl;
if (this == &object )
{
return *this;
}
if ( String::str != NULL)
{
delete[] str;
str = NULL;
}
int length = strlen(object.str)+1;
str = new char[length];
assert ( str != NULL );
memset(str,0,sizeof(char)*length);
strcpy(str,object.str);
return *this;
}
int main(void)
{
{
std::cout <<std::endl;
std::cout << "case 1 :" <<std::endl;
String s;
s.print();
}
{
std::cout <<std::endl;
std::cout << "case 2 :" <<std::endl;
const char* ss = "123abc1";
String s(ss);
s.print();
}
{
std::cout <<std::endl;
std::cout << "case 3 :" <<std::endl;
const char* ss = "123abc2";
std::cout<< ss <<std::endl;
String s(ss);
s.print();
//
String s1(s);
s1.print();
}
{
std::cout << std::endl;
std::cout << "case 4 :" << std::endl;
const char* ss = "123abc3";
std::cout<< ss <<std::endl;
String s(ss);
s.print();
String s1; //
s1.operator=(s); // 赋值语句也可以写成 s1 = s;
s1.print();
}
{
std::cout <<std::endl;
std::cout << "case 4 :" <<std::endl;
const char* ss = "123abc";
String s(ss);
String s1=s;
s1 = s1+s;
s1.print();
}
std::cout<< " " <<std::endl;
return 0;
}
//调试环境 linux g++