string类的实现(构造,拷贝构造,赋值元算符及输出流的实现)

string是c++的标准类库的一个字符串类,也称c++的字符串,有空的话自己实现这个类挺有意思的,当然这个类的功能是相当的强大,这里只是写了九牛一毛而已。

//sstring.h

#include <iostream>

using namespace std;

class SString
{
public:
 SString(const char *pSz=NULL);                      //构造函数
 SString(SString &str);                                          //复制构造
 ~SString(void);

 SString& operator=(const SString &str);          //赋值运算符
 bool operator==(const SString &str);                //相等运算符
 SString& operator+(const SString &str);          //字符串相连

 friend ostream &operator<<(ostream &cout, const SString &str);  // 输出流
private:
 char *m_pCh;
};

//sstring.cpp

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

SString::SString( const char *pSz /*= NULL*/)
{
 if(NULL == pSz)
 {
  m_pCh = new char[1];
  *m_pCh = '\0';
 }
 else
 {
  m_pCh = new char[strlen(pSz)+1];

  if(NULL != m_pCh)
  {
   strcpy(m_pCh, pSz);
  }
 }
}

SString::SString( SString &str )
{
 m_pCh = new char[strlen(str.m_pCh)+1];
 strcpy(m_pCh, str.m_pCh);
}

SString::~SString(void)
{
 if(NULL != m_pCh)
 {
  delete []m_pCh;
 }
}

SString& SString::operator=( const SString &str )
{
 if(this == &str)
 {
  return *this;
 }

 if(NULL != m_pCh)
 {
  delete m_pCh;
 }

 m_pCh = new char[strlen(str.m_pCh)+1];

 if(this != &str)
 {
  strcpy(m_pCh, str.m_pCh);
 }
 return *this;
}

bool SString::operator==( const SString &str )
{
 if(this == &str)
 {
  return true;
 }
 return false;
}

SString& SString::operator+( const SString &str )
{
 char *pTmp = new char[strlen(m_pCh)+1];
 strcpy(pTmp, m_pCh);

 delete []m_pCh;

 m_pCh = new char[strlen(pTmp) + strlen(str.m_pCh) + 1];

 strcpy(m_pCh, pTmp);
 strcat(m_pCh, str.m_pCh);

 return *this;
}

 SString SString::operator++( int )
 {
  SString tmp =*this;
 
  ++(*this);
  return SString(tmp);
 }

 

上面的实现不难,相信大家都会,但有很多的细节需要注意的,比方说拷贝构造函数的参数为什么要用引用类型?是为了省去传值时不执行形参的拷贝吗?如果不是,那直接用类型可以吗,为什么, 用指针可以吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算符优先关系表是用于描述运算符优先级的表格,其中行表示栈顶素的优先级,列表示当前输入素的优先级,表格中的关系描述了栈顶素与输入素之间的优先关系。 算符优先关系表的构造可以分为以下几个步骤: 1. 定义终结符和非终结符 算符优先文法中要定义终结符和非终结符,常见的终结符包括运算符和括号,常见的非终结符包括表达式和运算。 2. 根据文法构造FIRST集和FOLLOW集 在确定算符优先关系表之前,要先根据文法构造FIRST集和FOLLOW集。FIRST集表示一个文法符号能够产生的开始终结符集合,FOLLOW集表示一个文法符号能够跟随其后的终结符集合。 3. 构造优先关系矩阵 优先关系矩阵是算符优先关系表的核心,它描述了运算符之间的优先关系。在构造优先关系矩阵时,要遍历所有的终结符和运算符,比较它们之间的优先级关系。 4. 填充优先关系矩阵 根据优先关系矩阵的定义,优先关系矩阵应该填充为 >、=、< 或空,以表示运算符之间的优先关系。在填充优先关系矩阵时,要根据终结符和运算符的优先级关系,以及它们之间的FIRST和FOLLOW集合进行判断。 5. 检查算符优先关系表的合法性 在构造算符优先关系表之后,要检查它的合法性,确保每个终结符和运算符之间只有一种优先关系,且没有循环依赖关系。 6. 应用算符优先关系表 将算符优先关系表应用于表达式的求值中,根据算符优先关系表的优先关系,决定运算符的结合顺序和优先级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值