C/C++面试:27---自己设计实现一个String类

一、源码链接

二、实现代码

// string.h
#ifndef __STRING_H_
#define __STRING_H_

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

using namespace std;

class String
{
public:
    String();
    String(int n, char c);
    String(const char* source);
    String(const String& s);

    ~String();
public:
    String& operator=(const char* s);
    String& operator=(const String& s);
    
    char& operator[](int i);
    const char& operator[](int i)const;

    String& operator+=(const String& s);
    String& operator+=(const char *s);
    
    friend ostream& operator<<(ostream& out, const String& s);
    friend istream& operator>>(istream& in, String& s);

    friend bool operator<(const String& s1, const String& s2);
    friend bool operator>(const String& s1, const String& s2);
    friend bool operator<=(const String& s1, const String& s2);
    friend bool operator>=(const String& s1, const String& s2);

    friend bool operator==(const String& s1, const String& s2);
    friend bool operator!=(const String& s1, const String& s2);
public:
    char* getData() { return data; }
    int length() { return size; }
private:
    int size;
    char *data;
};

#endif // __STRING_H_
// string.cpp
#include "String.h"

String::String()
{
    data = new char[1];
    *data = '\0';
    size = 0;
}

String::String(int n, char c)
{
    data = new char[n + 1];
    char *temp = data;

    while(n--)
        *temp++ = c;

    *temp = '\0';
    size = n;
}

String::String(const char * source)
{
    if(source == NULL)
    {
        data = new char[1];
        *data = '\0';
        size = 0;
        return;
    }
    
    size  = strlen(source);
    data = new char[size + 1];

    char *temp = data;

    while(*source != '\0')
        *temp++ = *source++;

    *temp = '\0';
}

String::String(const String& s)
{
    if(s.size == 0)
    {
        data = new char[1];
        *data='\0';
        size = 0;
        return;
    }

    data = new char[s.size + 1];

    char *temp1 = data;
    char *temp2 = s.data;

    while(*temp2 != '\0')
        *temp1++ = *temp2++;
    *temp1= '\0';

    size = s.size;
    
}

String::~String()
{
    if(data)
    {
        delete[] data;
        data = nullptr;
        size = 0;
    }
}

String& String::operator=(const char* s)
{
    if(data)
    {
        delete[] data;
    }

    if(s == NULL)
    {
        data = new char[1];
        *data = '\0';
        size = 0;
    }

    size = strlen(s);
    data = new char[size + 1];

    char *temp = data;
    
    while(*s != '\0')
        *temp++ = *s++;

    *temp = '\0';

    return *this;
}

String& String::operator=(const String& s)
{
    if(this == &s)
        return *this;

    if(data)
        delete[] data;

    size = s.size;
    
    data = new char[size + 1];

    char *temp1 = s.data;
    char *temp2 = data;
    
    while(*temp1 != '\0')
        *temp2++ = *temp1++;
    *temp2 = '\0';

    return *this;
}

char& String::operator[](int i)
{
    return data[i];
}

const char& String::operator[](int i)const
{
    return data[i];
}

String& String::operator+=(const String& s)
{
    if(s.size == 0)
        return *this;

    char *temp = new char[size + s.size + 1];
    memcpy(temp, data, size);

    memcpy(temp + size, s.data, s.size);
    *(temp + size + s.size + 1) = '\0';

    if(data != NULL)
        delete[] data;
    data = temp;
    size += s.size;

    return *this;
}

String& String::operator+=(const char *s)
{
    if(s == NULL || (strlen(s) == 0))
        return *this;

    char *temp = new char[size + strlen(s) + 1];
    memcpy(temp, data, size);
    memcpy(temp + size, s, strlen(s));
    *(temp + size + strlen(s) + 1) = '\0';

    if(data != NULL)
        delete[] data;
    data = temp; 
    size += strlen(s);

    return *this;
}
 
ostream& operator<<(ostream& out, const String& s)
{
    out << s.data;
    return out;
}

istream& operator>>(istream& in, String& s)
{
    char p[50];
    in.getline(p, 50);
    
    s = p; // 调用赋值运算符
    
    return in;
}

bool operator<(const String& s1, const String& s2)
{
    int i = 0;
    while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
        i++;

    return (s1[i] < s2[i]) ? true : false;
} 

bool operator>(const String& s1, const String& s2)
{
    return !(s1 < s2);
}

bool operator<=(const String& s1, const String& s2)
{
    int i = 0;
    while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
        i++;
    
    return (s1[i] < s2[i] || (i == s1.size)) ? true : false;
}


bool operator>=(const String& s1, const String& s2)
{
    return !(s1 < s2);
}

bool operator==(const String& s1, const String& s2)
{
    char *temp1 = s1.data;
    char *temp2 = s2.data;

    if(s1.size != s2.size)
        return false;

    while((*temp1++ == *temp2++) && (*temp1 != '\0') && (*temp2 != '\0'));

    if(*temp1 == '\0')
        return true;
}

bool operator!=(const String& s1, const String& s2)
{
    return !(s1 == s2);
}

 三、测试代码

// main.cpp
#include "String.h"

using namespace std;

int main()
{
    std::cout << "********构造函数********" << std::endl;

    String s1;
    std::cout << "s1:" << s1 << std::endl;
    
    String s2(10, 'a');
    std::cout << "s2:" << s2 << std::endl;

    String s3("HelloWorld");
    std::cout << "s3:" << s3 << std::endl << std::endl;



    std::cout << "********拷贝构造********" << std::endl;

    String s4(s2);
    std::cout << "s4:" << s4 << std::endl;

    String s5 = s3;
    std::cout << "s5:" << s5 << std::endl << std::endl;



    std::cout << "********=运算符********" << std::endl;

    s4 = "bbb";
    std::cout << "s4:" << s4 << std::endl;

    s4 = s5;
    std::cout << "s4:" << s4 << std::endl << std::endl;



    std::cout << "********下标运算符********" << std::endl;
    
    std::cout <<"s4[0]: " <<s4[0] << std::endl;
    std::cout <<"s4[1]: " <<s4[1] << std::endl;
    std::cout <<"s4[9]: " <<s4[9] << std::endl << std::endl;


    std::cout << "********+=运算符********" << std::endl;

    s4 += s5;
    std::cout << "s4:" << s4 << std::endl;
    s4 += ",C++";
    std::cout << "s4:" << s4 << std::endl;

    s5 += s4;
    std::cout << "s5:" << s5 << std::endl;
    s5 += ",C";
    std::cout << "s5:" << s5 << std::endl << std::endl;



    std::cout << "********>、<、>=、<=运算符********" << std::endl;

    String s6("abc");
    String s7("abcd");
    String s8("axc");

    std::cout << "s6 > s7: " << (s6 > s7) <<std::endl;
    std::cout << "s6 < s7: " << (s6 < s7) <<std::endl;
    std::cout << "s6 >= s7: " << (s6 >= s7) <<std::endl;
    std::cout << "s6 <= s7: " << (s6 <= s7) <<std::endl;

    std::cout << "s6 > s8: " << (s6 > s8) <<std::endl;
    std::cout << "s6 < s8: " << (s6 < s8) <<std::endl;
    std::cout << "s6 >= s8: " << (s6 >= s8) <<std::endl;
    std::cout << "s6 <= s8: " << (s6 <= s8) <<std::endl <<std::endl;



    std::cout << "********==、!=运算符********" << std::endl;

    
    String s9("abc");
    String s10("axcd");
    String s11("abcd");
    String s12("abcd");

    std::cout << "s9 == s10: " << (s9 == s10) <<std::endl;
    std::cout << "s9 != s10: " << (s9 != s10) <<std::endl;
    std::cout << "s9 == s11: " << (s9 == s11) <<std::endl;
    std::cout << "s9 != s11: " << (s9 != s11) <<std::endl;

    std::cout << "s11 == s12: " << (s11 == s12) <<std::endl;
    std::cout << "s11 != s12: " << (s11 != s12) <<std::endl <<std::endl;


    std::cout << "********>>运算符********" << std::endl;

    String s13;
    std::cout << "Please write to s13: ";
    cin >> s13;
    std::cout << "s13: " << s13 <<std::endl;

    
    return 0;
}

四、运行效果如下

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107571527
今日推荐