string class (字符串类的设计,带指针的class)
包括内容:
深度拷贝:类中指针所指向的区域 需要拷贝
new:先分配memory,再调用构造函数
delete:先调用析构函数,再释放memory
动态分配内存
堆、栈的区别
内存分配方式的可视化(release and debug)
big three:拷贝构造、拷贝赋值、析构函数
new/delete配合使用,注意加 [ ]
代码:
mystring.h
#ifndef STRING_H
#define STRING_H
class myString
{
public:
myString(const char* cstr = nullptr);
myString(const myString& str); // copy constructor
myString& operator =(const myString& str); // copy assignment operator
~myString();
char* get_c_str() const { return m_data; } // inline function
private:
char* m_data;
};
#endif // STRING_H
mystring.cpp
#include "mystring.h"
#include <string.h>
#include <iostream>
using namespace std;
inline
myString::myString(const char* cstr)
{
if (cstr)
{
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
m_data = new char[1]; // Allocate memory
*m_data = '\0';
}
}
inline
myString::~myString()
{
delete [] m_data;
}
inline
myString::myString(const myString &str)
{
// deep copy (no memory leak)
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
inline myString&
myString::operator =(const myString& str)
{
if (this == &str)
{
return *this; // must do: self assignment
}
delete [] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
inline ostream&
operator <<(ostream& os, const myString& str)
{
return os << str.get_c_str();
}
main.cpp
#include <iostream>
#include "mystring.h"
#include "mystring.cpp"
using namespace std;
int main()
{
myString s1;
cout << s1 << endl;
myString s2("hello");
cout << s2 << endl;
myString s3(s2);
cout << s3 << endl;
s1 = s2;
cout << s1 << endl;
return 0;
}
运行结果:
内存分配可视化: