这次介绍的是另一个经典的类String。与上次介绍的类complex相比,类String多了指针型数据成员,所以其构造和析构会更加复杂一些。需要考虑内存的分配和释放。对于一个经验丰富的程序员,写出一个完整的String类并不难。但对于一个新手来说,想做到面面俱到并不简单。所以这个类也会经常被面试官拿来考验应届生基本功。下面为类String的定义和测试代码。
类String的定义
//string.h
#ifndef _MYSTRING_
#define _MYSTRING_
#include <cstring>
#include <iostream>
using namespace std;
class String
{
public:
String(const char* cstr = 0);
String(const String& str);
~String();
String& operator= (const String& str);
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
//构造函数
inline String::String(const char* cstr)
{
//只要参数为指针,需要考虑其是否为空
if (cstr)
{
//new一片字符串参数等大的内存
m_data = new char[strlen(cstr) + 1];
strcpy_s(m_data, strlen(m_data), cstr);
}
else
{
//若参数为空,new一个字符来容纳
m_data = new char[1];
*m_data = '\0';
}
}
//拷贝构造函数
inline String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy_s(m_data, strlen(m_data), str.m_data);
}
//析构函数
inline String :: ~String()
{
delete[] m_data;
}
//拷贝赋值函数
inline String& String :: operator= (const String& str)
{
//检测自赋值,防止内存泄漏
if (&str == this)
return *this;
//释放原有内存
delete[] m_data;
//new一片与参数对象等大的新内存
m_data = new char[strlen(str.m_data) + 1];
strcpy_s(m_data, strlen(m_data), str.m_data);
return *this;
}
//重载操作符<<,可直接打印String对象
ostream& operator<< (ostream& os, String& str)
{
return os << str.get_c_str();
}
#endif
测试代码
//string_test.cpp
#include "string.h"
#include <iostream>
using namespace std;
int main()
{
String s1("hellow");
String s2("world");
String s3(s1);
String s4 = s2;
cout << s1 << endl;
cout << s2 << endl;
cout << s3 << endl;
cout << s4 << endl;
system("pause");
return 0;
}
另附类complex的详解地址:https://blog.csdn.net/qq_40319799/article/details/87923395