#【侯捷】创建一个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);