• C++自己实现string类


    C++面试或者笔试的时候经常遇到这样一个问题,就是自己实现一个string类。

    本人总结自己的面试经验以及参考网上各位网友的总结,总得来说常见的主要实现的包括以下几个方面(如有不如,欢迎补充)

    常见:普通的构造函数、拷贝构造函数、析构函数、字符串的链接即‘+’号运算符重载、字符串赋值即‘=’号运算符重载、字符串是否相等即‘==’号运算符重载、获取字符串长度

    不常见:输入‘>>’重载、输出‘<<'重载

    StringRealiza.h

     1 #pragma once
     2 
     3 #include <iostream>
     4 
     5 class StringRealize
     6 {
     7     friend std::ostream& operator<<(std::ostream& os, const StringRealize& str);//输出符重载
     8     friend std::ostream& operator>>(std::ostream& os, const StringRealize& str);//输入符重载
     9 
    10 public:
    11     StringRealize(const char *str = NULL);//普通构造函数
    12     StringRealize(const StringRealize& str);//拷贝构造函数
    13     ~StringRealize(void);//析构函数
    14 
    15     StringRealize& operator=(const StringRealize& str);//赋值运算符'='号重载
    16     StringRealize operator+(const StringRealize& str);//链接字符串‘+’号重载
    17     bool operator==(const StringRealize& str);//等号运算符‘==’号重载
    18 
    19     int getLength(void);//获取字符串的长度
    20 private:
    21     char *m_data;//用于保存字符串
    22 };

    StringRealiza.cpp

      1 #include "StringRealize.h"
      2 
      3 //普通构造函数
      4 StringRealize::StringRealize(const char *str)
      5 {
      6     if (str == NULL)
      7     {
      8         this->m_data = NULL;
      9     }
     10     else
     11     {
     12         this->m_data = new char[strlen(str) + 1];
     13         strcpy(this->m_data,str);
     14     }
     15 }
     16 
     17 //拷贝构造函数
     18 StringRealize::StringRealize(const StringRealize& str)
     19 {
     20     if (str.m_data == NULL)
     21     {
     22         this->m_data = NULL;
     23     }
     24     else
     25     {
     26         this->m_data = new char[strlen(str.m_data) + 1];
     27         strcpy(this->m_data,str.m_data);
     28     }
     29 }
     30 
     31 //析构函数
     32 StringRealize::~StringRealize(void)
     33 {
     34     if (this->m_data)
     35     {
     36         delete[] this->m_data;
     37         this->m_data = NULL;
     38     }
     39 }
     40 
     41 //赋值运算符'='号重载
     42 StringRealize& StringRealize::operator=(const StringRealize& str)
     43 {
     44     if (this != &str)
     45     {
     46         delete[] this->m_data;
     47         this->m_data = NULL;
     48 
     49         if (str.m_data == NULL)
     50         {
     51             this->m_data = NULL;
     52         }
     53         else
     54         {
     55             this->m_data = new char[strlen(str.m_data) + 1];
     56             strcpy(this->m_data,str.m_data);
     57         }
     58     }
     59 
     60     return *this;
     61 }
     62 
     63 //链接字符串‘+’号重载
     64 StringRealize StringRealize::operator+(const StringRealize& str)
     65 {
     66     StringRealize newString;
     67     if (str.m_data == NULL)
     68     {
     69         return *this;
     70     } 
     71     else if (this->m_data == NULL)
     72     {
     73         newString = str;
     74     }
     75     else
     76     {
     77         newString.m_data = new char[strlen(str.m_data) + strlen(this->m_data) + 1];
     78         strcpy(newString.m_data,this->m_data);
     79         strcpy(newString.m_data,str.m_data);
     80     }
     81 
     82     return newString;
     83 }
     84 
     85 //等号运算符‘==’号重载
     86 bool StringRealize::operator==(const StringRealize& str)
     87 {
     88     if (strlen(this->m_data) != strlen(str.m_data)  )
     89     {
     90         return false;
     91     }
     92     else
     93     {
     94         return strcmp( this->m_data, str.m_data ) ? false : true;
     95     }
     96 
     97 }
     98 
     99 //获取字符串的长度
    100 int StringRealize::getLength()
    101 {
    102     return strlen(this->m_data);
    103 }
    104 
    105 //输出符重载
    106 std::ostream& operator<<(std::ostream& os, const StringRealize& str)
    107 {
    108     os<<str.m_data;
    109     return os;
    110 }
    111 
    112 //输入符重载
    113 std::ostream& operator>>(std::ostream& os, const StringRealize& str)
    114 {
    115     os>>str.m_data;
    116     return os;
    117 }
  • 相关阅读:
    编程这几天出现的很2的问题!!!
    2020 8 1 每日总结
    2020 8 6 每日总结
    2020 8 7 读后感
    2020 8 4 每日总结
    2020 7 30 每日总结
    2020 8 3 每日总结
    2020 8 8 每日总结
    2020 8 2 每周总结
    2020 8 5 每日总结
  • 原文地址:https://www.cnblogs.com/LYF-LIUDAO/p/7066128.html
Copyright © 2020-2023  润新知