zoukankan      html  css  js  c++  java
  • 【C++札记】实现C++的string类

    C++有了string类使得操作字符串变得很方便。有关string类,面试过程中也经常问到的就是自己实现一个sring类。下边实现个String类供大家参考:

    String.h

    #pragma once
    class String
    {
    public:
    	//构造函数
    	String(const char* str = nullptr);
    	
    	//拷贝构造函数
    	String(const String & another);
    
    	//析构函数
    	~String();
    
    	//获得长度
    	int size();
    
    	//转换成char*
    	char* c_str();
    
    	//运算符重载=
    	String& operator=(const String &str);
    
    	//运算符重载+
    	String operator+(const String &str) const;
    
    	//运算符重载==
    	bool operator==(const String &str);
    
    	//运算符重载
    	char& operator[](int index);
    
    private:
    	char* _str;
    	int   len;
    };
    
    

    String.cpp

    #include "String.h"
    #include <string.h>
    
    //构造函数
    String::String(const char* str)
    {
    	if (str)
    	{
    		len = strlen(str);
    		_str = new char[len + 1];
    		strcpy_s(_str, len + 1, str);
    	}
    	else
    	{
    		len = 0;
    		_str = new char[1]{ 0 };
    	}
    }
    
    //拷贝构造函数
    String::String(const String & another)
    {
    	_str = new char[another.len + 1];
    	strcpy_s(_str, another.len + 1, another._str);
    	len = another.len;
    }
    
    //析构函数
    String::~String()
    {
    	if (_str)
    	{
    		delete[] _str;
    		_str = NULL;
    	}
    }
    
    //获取长度
    int String::size()
    {
    	return len;
    }
    
    //转换成char*
    char* String::c_str()
    {
    	return _str;
    }
    
    //运算符重载=
    String& String::operator=(const String &str)
    {
    	if (this == &str)
    	{
    		return *this;
    	}
    	delete[] _str;
    	_str = new char[str.len + 1]{ 0 };
    	strcpy_s(_str, str.len + 1, str._str);
    	return *this;
    }
    
    //运算符重载+
    String String::operator+(const String &str) const
    {
    	String newString;
    	newString.len = len + str.len;
    	newString._str = new char[newString.len + 1];
    	strcpy(newString._str, _str);
    	strcat(newString._str, str._str);
    	return newString;
    }
    
    //运算符重载==
    bool String::operator==(const String &str)
    {
    	if (strcmp(_str, str._str) == 0)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    
    //运算符重载[]
    char& String::operator[](int index)
    {
    	if (index < len)
    	{
    		return _str[index];
    	}
    	else
    	{
    		return _str[len - 1];
    	}
    }

    测试:

    int main()
    {
    	String str1("wangpengfei"); //有参构造函数测试
    	String str2(str1);			//拷贝构造函数测试
    
    	String str3 = "wanghongyan";
    	String str4 = " wangchouhou";
    	String str5 = str3 + str4;	//重载运算符+测试
    	cout << str3[0] << endl;	//重载运算符[]测试
    	String str6 = "wanghongyan";
    	if (str6 == str3)			//重载运算符==测试
    	{
    		cout << "str3 str6相等" << endl;
    	}
    
    	cout << str3.size() << endl;//成员函数size()测试	
    	cout << str3.c_str() << endl;//成员函数c_str()测试
    	
    
    	getchar();
    }

  • 相关阅读:
    #网络流,最小割#洛谷 1344 [USACO4.4]追查坏牛奶Pollutant Control
    #线段树,倒序#CF356A Knight Tournament
    #错排,高精度#洛谷 3182 [HAOI2016]放棋子
    #KMP,dp#洛谷 3426 [POI2005]SZA-Template
    #差分约束系统,Spfa,SLF优化#Hdu 3666 THE MATRIX PROBLEM
    #min_max容斥#Hdu 4336 Card Collector
    #组合计数,卢卡斯定理#D 三元组
    #计数,记忆化搜索#C 连边方案
    #区间dp,离散#D 弱者对决
    #dp#C 公共子序列
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694517.html
Copyright © 2011-2022 走看看