背景介绍
在B站上看完侯捷老师讲解的两个类:String类 and complex类,这两个类的实现体现了不带指针和带指针的区别,也可以作为设计类的参考学习。
这两个类的实现过程中有很多小细节的东西需要注意,否则很可能造成编译报错。
编写带指针的类String
在c++的ansi库中有有一个string类,用于处理字符串。那么便仿写一个String类,实现其基本功能。
mystring.h
#pragma once
#ifndef __MYSTRING__
#define __MYSTRING__
#include <iostream>
#include <string.h>
using namespace std;
class String
{
public:
String(const char *cstr = 0);
String(const String& str);
String& operator = (const String& str);
~String();
char* get_c_str() const { return m_data; };
private:
char* m_data;
};
/* global function */
ostream& operator<< (ostream& os, const String& str);
#endif // !__MYSTRING__
mystring.cpp
#include "mystring.h"
/* 普通构造函数 */
String::String(const char *cstr)
{
if (cstr)
{
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
/* 析构函数 */
String::~String()
{
delete[] m_data;
}
/* 拷贝构造函数 */
String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
/* 拷贝赋值函数 */
String& String::operator = (const String& str)
{
if (this == &str) // 检测自我赋值 self assignment
{
return *this;
}
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
ostream& operator<< (ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
main.cpp
#include "mystring.h"
int main(void)
{
String s1 = "hello";
String s2(s1);
String s3 = s2;
cout << "s1: " << s1 << endl;
cout << "s2: " << s1 << endl;
cout << "s3: " << s1 << endl;
return 0;
}
标签:const,String,double,C++,complex,operator,和析构,data,构造函数 From: https://www.cnblogs.com/caojun97/p/17717637.html