C++面向对象之类String详解

这次介绍的是另一个经典的类String。与上次介绍的类complex相比,类String多了指针型数据成员,所以其构造和析构会更加复杂一些。需要考虑内存的分配和释放。对于一个经验丰富的程序员,写出一个完整的String类并不难。但对于一个新手来说,想做到面面俱到并不简单。所以这个类也会经常被面试官拿来考验应届生基本功。下面为类String的定义和测试代码。

类String的定义

//string.h

#ifndef _MYSTRING_
#define _MYSTRING_

#include <cstring>
#include <iostream>

using namespace std;

class String
{
public:
	String(const char* cstr = 0);
	String(const String& str);
	~String();
	String& operator= (const String& str);
	char* get_c_str() const { return m_data; }

private:
	char* m_data;
};

//构造函数
inline String::String(const char* cstr)
{
    //只要参数为指针,需要考虑其是否为空
	if (cstr)
	{    
        //new一片字符串参数等大的内存
		m_data = new char[strlen(cstr) + 1];
		strcpy_s(m_data, strlen(m_data), cstr);
	}
	else
	{
        //若参数为空,new一个字符来容纳
		m_data = new char[1];
		*m_data = '\0';
	}
}

//拷贝构造函数
inline String::String(const String& str)
{
		m_data = new char[strlen(str.m_data) + 1];
		strcpy_s(m_data, strlen(m_data), str.m_data);
}

//析构函数
inline String :: ~String()
{
	delete[] m_data;
}

//拷贝赋值函数
inline String& String :: operator= (const String& str)
{
    //检测自赋值,防止内存泄漏
	if (&str == this)
		return *this;

    //释放原有内存
	delete[] m_data;
    //new一片与参数对象等大的新内存
	m_data = new char[strlen(str.m_data) + 1];
	strcpy_s(m_data, strlen(m_data), str.m_data);
		
	return *this;
}

//重载操作符<<,可直接打印String对象
ostream& operator<< (ostream& os, String& str)
{
	return os << str.get_c_str();
}

#endif

测试代码

//string_test.cpp

#include "string.h"
#include <iostream>

using namespace std;

int main()
{
	String s1("hellow");
	String s2("world");

	String s3(s1);
	String s4 = s2;

	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;

	system("pause");
	return 0;
}

另附类complex的详解地址:https://blog.csdn.net/qq_40319799/article/details/87923395

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值