C++

【侯捷】创建一个String类

Posted by LudoArt on August 14, 2019

#【侯捷】创建一个String类

本文章中涉及的知识点:

  • big three(析构函数、拷贝构造函数、拷贝赋值函数)
  • delete

创建一个string.h的头文件,将String类的定义和声明都写在该头文件中。

//防卫式声明

#ifndef __MYSTRING__

#define __MYSTRING__

class String {
public:
	String(const char* cstr = 0);
	String(const String& str);
	String& operator= (const String& str);
	~String();
	char* get_string() const { return m_data; }
private:
	char * m_data;
};

#include <cstring>

#pragma warning(disable:4996)

//构造函数(此处无需再一次写默认初值,否则报错重定义)

inline String::String(const char* cstr) {
	//if (cstr == 0)
	if (cstr) {
		m_data = new char[strlen(cstr) + 1];
		strcpy(m_data, cstr);
	}
	else { //未指定初值

		m_data = new char[1];
		//或者*m_data = '\0';

		m_data[0] = '\0';
	}
}

//析构函数

inline String::~String() {
	//delete m_data;

	//因为申请的数组,所以要删除整个数组

	delete[] m_data;
}

//拷贝构造函数

inline String::String(const String& str) {
	m_data = new char[strlen(str.m_data) + 1];
	strcpy(m_data, str.m_data);
}

//拷贝赋值函数

inline String& String::operator= (const String& str) {
	//if (this->m_data == str.get_string())

	//检测自我赋值,应该去检测两个对象是否指向同一块地址

	if (this == &str) {
		return *this;
	}

	delete[] m_data;
	m_data = new char[strlen(str.m_data) + 1];
	strcpy(m_data, str.m_data);
	return *this;
}

#endif // !__MYSTRING

创建一个string.cpp,测试在string.h中的定义和声明的String类。

#include "string.h"

#include <iostream>

using namespace std;

ostream& operator<<(ostream &os, const String& str) {
	return os << str.get_string();
}

int main()
{
	String s1();
	String s2("hello");

	//此处若是String s3(s1);则报错,原因未知

	String s3(s2);
	cout << s3 << endl;
	s3 = s2;
	cout << s3 << endl;
    return 0;
}

关于上面代码中 String s3(s1); 报错原因:

因为 String s1(); 相当于声明一个函数,函数的参数列表为空,返回值类型为String

若要声明一个无参的 String 类对象,则应使用 String s1;

故正确的写法是:

String s1; String s3(s1);