C++三大函数:
- 拷贝构造函数
- 拷贝赋值函数
- 析构函数
设计一个CMyString类,实现上述三大函数,手撕代码如下:
#pragma once
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
class CMyString
{
public:
CMyString(const char* pStr);
CMyString(const CMyString& str);
CMyString& operator = (const CMyString& str);
~CMyString();
public:
char* GetData() const;
private:
char* m_pData;
};
//构造
//默认构造
CMyString::CMyString(const char* pStr):m_pData(NULL)
{
if (pStr)
{
m_pData = new char[strlen(pStr) + 1];
//std::cout << "len: " << strlen(pStr) << std::endl;
strcpy(m_pData, pStr);
}
else
{
m_pData = new char[1];
*m_pData = '\0';
}
}
//拷贝构造
CMyString::CMyString(const CMyString& str)
{
m_pData = new char[strlen(str.GetData()) + 1];
strcpy(m_pData, str.GetData());
}
//拷贝赋值 重载=操作符
CMyString& CMyString::operator=(const CMyString& str)
{
if (str.GetData() == m_pData)
{
return *this;
}
else
{
delete[] m_pData;
m_pData = new char[strlen(str.GetData()) + 1];
strcpy(m_pData, str.GetData());
return *this;
}
}
//析构
CMyString::~CMyString()
{
if (m_pData)
{
delete[] m_pData;
m_pData = NULL;
}
}
//实现
char* CMyString::GetData() const
{
return m_pData;
}
//测试例代码
#include "CMyString.h"
#include <stdlib.h>
int main()
{
//big three
CMyString s1("helloxw");
std::cout << "s1: " <<s1.GetData()<<std::endl;
CMyString s2(s1);
std::cout << "s2: " << s2.GetData() << std::endl;
CMyString s3 = s2;
std::cout << "s3: " << s3.GetData() << std::endl;
CMyString s4 = "world";
std::cout << "s4: " << s4.GetData() << std::endl;
s1 = s4;
std::cout << "拷贝赋值后的s1: " << s1.GetData() << std::endl;
}
//运行结果截图: