首页 > 试题广场 >

请用c++ 实现stl中的string类,实现构造,拷贝构造

[问答题]
请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
推荐
/*-------------------------------------
*   日期:2015-03-31
*   作者:SJF0115
*   题目: 实现string类
*   来源:百度
*   博客:
------------------------------------*/
#include <iostream>
#include <cstring>
using namespace std;

class String{
public:
    // 默认构造函数
    String(const char* str = NULL);
    // 复制构造函数
    String(const String &str);
    // 析构函数
    ~String();
    // 字符串连接
    String operator+(const String & str);
    // 字符串赋值
    String & operator=(const String &str);
    // 字符串赋值
    String & operator=(const char* str);
    // 判断是否字符串相等
    bool operator==(const String &str);
    // 获取字符串长度
    int length();
    // 求子字符串[start,start+n-1]
    String substr(int start, int n);
    // 重载输出
    friend ostream & operator<<(ostream &o,const String &str);
private:
    char* data;
    int size;
};
// 构造函数
String::String(const char *str){
    if(str == NULL){
        data = new char[1];
        data[0] = '\0';
        size = 0;
    }//if
    else{
        size = strlen(str);
        data = new char[size+1];
        strcpy(data,str);
    }//else
}
// 复制构造函数
String::String(const String &str){
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
}
// 析构函数
String::~String(){
    delete[] data;
}
// 字符串连接
String String::operator+(const String &str){
    String newStr;
    //释放原有空间
    delete[] newStr.data;
    newStr.size = size + str.size;
    newStr.data = new char[newStr.size+1];
    strcpy(newStr.data,data);
    strcpy(newStr.data+size,str.data);
    return newStr;
}
// 字符串赋值
String & String::operator=(const String &str){
    if(data == str.data){
        return *this;
    }//if
    delete [] data;
    size = str.size;
    data = new char[size+1];
    strcpy(data,str.data);
    return *this;
}
// 字符串赋值
String& String::operator=(const char* str){
    if(data == str){
        return *this;
    }//if
    delete[] data;
    size = strlen(str);
    data = new char[size+1];
    strcpy(data,str);
    return *this;
}
// 判断是否字符串相等
bool String::operator==(const String &str){
    return strcmp(data,str.data) == 0;
}
// 获取字符串长度
int String::length(){
    return size;
}
// 求子字符串[start,start+n-1]
String String::substr(int start, int n){
    String newStr;
    // 释放原有内存
    delete [] newStr.data;
    // 重新申请内存
    newStr.data = new char[n+1];
    for(int i = 0;i < n;++i){
        newStr.data[i] = data[start+i];
    }//for
    newStr.data[n] = '\0';
    newStr.size = n;
    return newStr;
}
// 重载输出
ostream & operator<<(ostream &o, const String &str){
    o<<str.data;
    return o;
}

int main(){
    String str1("hello ");
    String str2 = "world";
    String str3 = str1 + str2;
    cout<<"str1->"<<str1<<" size->"<<str1.length()<<endl;
    cout<<"str2->"<<str2<<" size->"<<str2.length()<<endl;
    cout<<"str3->"<<str3<<" size->"<<str3.length()<<endl;

    String str4("helloworld");
    if(str3 == str4){
        cout<<str3<<" 和 "<<str4<<" 是一样的"<<endl;
    }//if
    else{
        cout<<str3<<" 和 "<<str4<<" 是不一样的"<<endl;
    }

    cout<<str3.substr(6,5)<<" size->"<<str3.substr(6,5).length()<<endl;
    return 0;
}
编辑于 2015-09-17 10:00:51 回复(6)
#include <utility>
#include <string.h>
classString
{
public:
    String():data_(newchar[1])
    {
        *data_ = '\0';
    }
    String(const char * str):data_(newchar[strlen(str) + 1])
    {
        strcpy(data_, str);
    }
    String(const String & rhs)
        : data_(newchar[rhs.size() + 1])
    {
        strcpy(data_, rhs.c_str());
    }
    /* Delegate constructor in C++11
    String(const String& rhs):String(rhs.data_)
    {
    }
    */
    ~String()
    {
        delete[] data_;
    }
    /* Traditional:
    String& operator=(const String& rhs)
    {
        String tmp(rhs);
        swap(tmp);
        return *this;
    }
    */
    String &operator=(String rhs)// yes, pass-by-value
    {
        swap(rhs);
        return*this;
    }
    // C++ 11
    String(String &&rhs): data_(rhs.data_)
    {
        rhs.data_ = nullptr;
    }
    String &operator=(String && rhs)
    {
        swap(rhs);
        return*this;
    }
    // Accessors
    size_t size() const
    {
        return strlen(data_);
    }
    const char * c_str() const
    {
        return data_;
    }
    void swap(String & rhs)
    {
        std::swap(data_, rhs.data_);
    }
private:
    char *data_;
};

编辑于 2015-09-17 09:55:37 回复(2)
class string{
  string();
  ~string();
  size_t len();
  size_t append();
  size_t cmp(const string&a);
  string& operator =(const string &a);
}
发表于 2014-11-04 10:13:27 回复(3)
主要方向是java C++早忘了,跳过
发表于 2014-12-03 19:30:34 回复(0)
String::String(const char* s)
{     if (nullptr == s) {         m_data = new char[1];         m_data[0] = '\0';     }     else {         m_data = new char[strlen(s) + 1];         strcpy(m_data, s);         //m_data[strlen(s)] = '\0';    //不需要,因为s+strlen(s)一定是'\0'     }     cout << "constructor: " << m_data << endl;
}

String::String(const String& rhs)
{     m_data = new char[strlen(rhs.m_data) + 1];     strcpy(m_data, rhs.m_data);     cout << "copy constructor: " << m_data << endl;
}

//不需要检验rhs是否为nullptr,因为它存在就代表它已经在构造的时候获得至少一字节的内存
String& String::operator=(const String& rhs)
{     char* new_data = new char[strlen(rhs.m_data) + 1];     strcpy(new_data, rhs.m_data);     delete[] m_data;    //m_data一定非空     m_data = new_data;     cout << "copy assignment: " << m_data << endl;     return *this;
}

String::~String()
{     cout << "destructor: " <</* m_data <<*/ endl;     delete[] m_data;
}

String::String(String&& rhs) : m_data(rhs.m_data)
{     rhs.m_data = nullptr;    //为空不会调用析构函数     cout << "move constructor: " << m_data << endl;
}

String& String::operator=(String&& rhs)
{     if (this != &rhs) {         delete[] m_data;         m_data = rhs.m_data;         rhs.m_data = nullptr;    //rhs.m_data=nullptr后,rhs变为0X0?     }     cout << "move assginment: " << m_data << endl;     return *this;
}


String& String::operator+=(const String& rhs)
{     char *new_data = new char[size() + rhs.size()];     strcpy(new_data, m_data);     strcpy(new_data + size(), rhs.m_data);     delete[] m_data;     m_data = new_data;     return *this;
}

String String::operator+(const String& rhs)
{     String ret_str;     delete[] ret_str.m_data;     char *new_data = new char[size() + rhs.size()];     strcpy(new_data, m_data);     strcpy(new_data + size(), rhs.m_data);     ret_str.m_data = new_data;     return ret_str;
}

String String::substr(size_t pos, size_t count)
{     if (pos > size() - 1) {         throw std::out_of_range("pos超出字符串范围");     }     char* new_data;     String ret_str;     delete[] ret_str.m_data;     if (pos + count >= size()) {         new_data = new char[size() - pos];         strcpy(new_data, m_data + pos);     }     else {         new_data = new char[count];         strncpy(new_data, m_data + pos, count);     }         ret_str.m_data = new_data;     return ret_str;
}

编辑于 2018-05-11 14:35:37 回复(0)
#include <iostream> #include <cstring> using namespace std; class String{ public: // 默认构造函数 String(const char* str = NULL); // 复制构造函数 String(const String &str); // 析构函数 ~String(); // 字符串连接 String operator+(const String & str); // 字符串赋值 String & operator=(const String &str); // 字符串赋值 String & operator=(const char* str); // 判断是否字符串相等 bool operator==(const String &str); // 获取字符串长度 int length(); // 求子字符串[start,start+n-1] String substr(int start, int n); // 重载输出 friend ostream & operator<<(ostream &o,const String &str); private: char* data; int size;
}; // 构造函数 String::String(const char *str){ if(str == NULL){
        data = new char[1];
        data[0] = '\0';
        size = 0;
    }//if else{
        size = strlen(str);
        data = new char[size+1]; strcpy(data,str);
    }//else } // 复制构造函数 String::String(const String &str){
    size = str.size;
    data = new char[size+1]; strcpy(data,str.data);
} // 析构函数 String::~String(){ delete[] data;
} // 字符串连接 String String::operator+(const String &str){
    String newStr; //释放原有空间 delete[] newStr.data;
    newStr.size = size + str.size;
    newStr.data = new char[newStr.size+1]; strcpy(newStr.data,data); strcpy(newStr.data+size,str.data); return newStr;
} // 字符串赋值 String & String::operator=(const String &str){ if(data == str.data){ return *this;
    }//if delete [] data;
    size = str.size;
    data = new char[size+1]; strcpy(data,str.data); return *this;
} // 字符串赋值 String& String::operator=(const char* str){ if(data == str){ return *this;
    }//if delete[] data;
    size = strlen(str);
    data = new char[size+1]; strcpy(data,str); return *this;
} // 判断是否字符串相等 bool String::operator==(const String &str){ return strcmp(data,str.data) == 0;
} // 获取字符串长度 int String::length(){ return size;
} // 求子字符串[start,start+n-1] String String::substr(int start, int n){
    String newStr; // 释放原有内存 delete [] newStr.data; // 重新申请内存 newStr.data = new char[n+1]; for(int i = 0;i < n;++i){
        newStr.data[i] = data[start+i];
    }//for newStr.data[n] = '\0';
    newStr.size = n; return newStr;
} // 重载输出 ostream & operator<<(ostream &o, const String &str){
    o<<str.data; return o;
} int main(){
    String str1("hello ");
    String str2 = "world";
    String str3 = str1 + str2; cout<<"str1->"<<str1<<" size->"<<str1.length()<<endl; cout<<"str2->"<<str2<<" size->"<<str2.length()<<endl; cout<<"str3->"<<str3<<" size->"<<str3.length()<<endl;

    String str4("helloworld"); if(str3 == str4){ cout<<str3<<" 和 "<<str4<<" 是一样的"<<endl;
    }//if else{ cout<<str3<<" 和 "<<str4<<" 是不一样的"<<endl;
    } cout<<str3.substr(6,5)<<" size->"<<str3.substr(6,5).length()<<endl; return 0;
}

发表于 2015-08-27 20:50:17 回复(0)
壕头像
XcXcXcXcXcXcXc
发表于 2014-12-01 21:55:59 回复(0)
发表于 2014-11-19 16:12:59 回复(0)
很经典的题了,我就不回答了
发表于 2014-11-04 14:21:59 回复(1)
1111
发表于 2014-11-04 10:33:58 回复(0)