学习时间及标题:
2022-2-4 带有指针的类的实现过程(头文件)
学习内容:
1.构造函数和析构函数:
2.拷贝构造:
3.拷贝赋值:
4.带指针的类必须要有拷贝构造和拷贝赋值:
5.stack(栈)和heap(堆)
stack:是作用域{}的一块内存空间。当你调用函数,函数本身会形成一个stack用来放置它所接收的参数,局部变量以及返回地址。
heap:是指由操作系统提供的一块global内存空间,程序可动态分配从中获得若干区块。
delete时就会调用析构函数。delete不带指针的类时,会调用default析构函数,delete带有指针的类时,则会调用我们自己写的析构函数。
代码:
#ifndef __MYSTRING__
#define __MYSTRING__
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;
};
#include <cstring>
inline
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';
}
}
inline
String::~String()
{
delete[] m_data;
}
inline
String& String::operator=(const String& str)
{
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;
}
inline
String::String(const String& str)
{
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
}
#include <iostream>
using namespace std;
ostream& operator<<(ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
#endif