1. 程式人生 > >模擬實現String類

模擬實現String類

String類模擬實現:

#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;


class String
{
public:
    String(char* str = "")
    {
        _size = strlen(str);
        _str = new char[_size+1];
        strcpy(_str,str);
    }
    String(const String& str)
    {
        _
size = strlen(str._str); _str = new char[_size+1]; strcpy(_str,str._str); } String& operator=(const String& str) { String tmp(str._str); char* p = tmp._str; tmp._str = _str; _str = p; _size = tmp._size; return *this; } ~String() { if
(_str) { delete[] _str; _size = 0; } } void DisPlay() { cout<<_str<<"->"<<_size<<endl; } size_t Size()const//返回物件 { return _size; } char& operator[](size_t index) { assert
(index<_size); return _str[index-1]; } String operator+(const String& s) { char* p = new char[strlen(_str)+strlen(s._str)+1]; strcpy(p,_str); strcat(p,s._str); String tmp(p); delete p; return tmp; } bool operator>(const String& s) { char* p1 = _str; char* p2 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 - *p2)>0) { return 1; } return 0; } bool operator<(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 - *p2)>0) { return 1; } return 0; } bool operator==(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 == '\0')&&(*p2 == '\0')) { return 1; } return 0; } bool operator!=(const String& s) { char* p2 = _str; char* p1 = s._str; while ((*p1 == *p2)&&(*p1 != '\0')&&(*p2 != '\0')) { *p1++; *p2++; } if ((*p1 == '\0')&&(*p2 == '\0')) { return 0; } return 1; } const char* C_Str()const//返回類中的字串 { return _str; } String SubStr(size_t pos, size_t n)//返回一個物件的子串物件 { char* p = new char[n+1]; strncpy(p,_str+pos-1,n); p[n]='\0'; String tmp(p); delete p; return tmp; } protected: private: char* _str; size_t _size; };

測試程式碼:

void Test1()//測試構造,拷貝構造,複製過載
{
    String str("hello ");
    str.DisPlay();
    String str1(str);
    str1.DisPlay();
    String str2 = str1;
    str2.DisPlay();
}
void Test2()//測試下標運算子[],和加法運算子+的過載
{
    String str("hello ");
    String str1("world ");
    String str2("private");
    str2 = str + str1;
    str2.DisPlay();

    cout<<str[2]<<endl;
}
void Test3()//測試關係運算符 >, <, ==, !=, 的過載
{
    String str("hello ");
    String str1("world ");
    String str2("hello ");
    if (str > str1)
    {
        cout<<"str 大於 str1"<<endl;
    }
    else
    {
        cout<<"str 不大於 str1"<<endl;
    }

    if (str < str1)
    {
        cout<<"str 小於 str1"<<endl;
    }
    else
    {
        cout<<"str 不小於 str1"<<endl;
    }

    if (str == str2)
    {
        cout<<"str 等於 str2"<<endl;
    }
    else
    {
        cout<<"str 不等於 str2"<<endl;
    }   

    if (str1 != str2)
    {
        cout<<"str 不等於 str2"<<endl;
    }
    else
    {
        cout<<"str 等於 str2"<<endl;
    }
}
void Test4()
{
    String str("hello ");
    String str1("world ");
    const char * pstr = str1.C_Str();
    cout<<pstr<<endl;
    str1 = str.SubStr(2,4);
    str1.DisPlay();
}


int main()
{

    Test1();
    Test2();
    Test3();
    Test4();
    return 0;
}

淺拷貝和深拷貝

  在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另一個物件,如A=B。這時,如果B中有一個成員變數指標已經申請了記憶體,那A中的那個成員變數也指向同一塊記憶體。這就出現了問題:當B把記憶體釋放了(如:析構),這時A內的指標就是野指標了,出現執行錯誤。

深拷貝:
在進行拷貝的過程中,新開闢一塊空間,然後將要拷貝的內容放到新開闢的空間裡,
這裡寫圖片描述

對另一個物件進行賦值時,要根據賦值物件,對被賦值物件的空間進行調整,這時候就要用到深拷貝。

相關推薦

模擬實現string的增刪查改

//string.h 標頭檔案函式介面的宣告以及變數的宣告部分 #ifndef __String__ #define __String__ #include <iostream> #include <assert.h> using

模擬實現String

String類模擬實現: #include <iostream> #include <assert.h> #include <string.h> using namespace std; class String { p

模擬實現String----傳統寫法

面試時經常會遇到一道題,就是寫一個簡單的String類,很多人不假思索的就給出了下面這樣的寫法class String { String(char* str) :_str(new char[str

實現string

存在 pre div pan turn class con ret bsp /* 實現string類 */ class String { public: String(const char *str=NULL); //構造函數

C++實現string型的大數相加(帶小數)

字符 urn sin 個數 dem 做了 優化 count 變量 近日,做了一道阿裏給的大數相加的編程題。題目大意如下: 輸入兩個string類型的數,如12.223 11,判斷輸入字符串是否合法。合法則輸出true以及相加結果(true 23.223),非法則輸出fal

自己實現String及其迭代器

注意事項: 對於C語言字串char*,必須在末尾置'\0'; 對指標操作時,必須考慮指標NULL的情況,對strcpy,strcat等庫函式呼叫也一樣; 對指標重新賦值前必須呼叫delete,同一塊記憶體不能呼叫兩次delete; 返回物件的成員函式要區分返回的是當前

c++實現String(建構函式,解構函式,複製建構函式,各類運算子過載函式的編寫)

編寫類 String 的建構函式,解構函式,複製建構函式  需要過載下面的運算子: 1、<、>、==和!=比較運算子 2、+=連線運算子和賦值運算子 3、<<輸出運算子和>>輸入運算子 String.h #ifndef _STRING

讀書筆記:實現string的建構函式、拷貝建構函式、解構函式、過載運算子=

#include <iostream> #include <cassert> #include <cstring> using namespace std; class MyString{ public: MyString(co

C++簡單實現string

面試經常會考到的型別,主要考的是幾個建構函式和過載運算子,簡單的實現一下 class CString { public: CString(); ~CString(); int Length()const{return m_len;} CString(const ch

模擬實現string 增刪查改 比較大小

要求: 模擬實現c++庫函式裡面string的部分功能,實現增刪查改,比較預算符的過載 #ifndef __MySTRING_H__ #define __MYSTRING_H__ #define _CRT_SECURE_NO_DEPRECATE 1 #include&l

使用引用計數和copy-on_write實現String

cpp 不容易 The 簡單 但是 c++對象 之前 his 遷移 本文寫於2017-01-18,從老賬號遷移到本賬號,原文地址:https://www.cnblogs.com/huangweiyang/p/6295420.html 這算是我開始復習的內容吧,關於strin

C++實現String

class String{ public: String(const char* str = "") { if (NULL == str){ _str = new char[1 + 4]; _str += 4; *_str = '\0'; }

C++模擬實現複數

#include <iostream> using namespace std; class Complex { public: Complex(double Real = 0.0f, double Image = 0.0f)

模擬實現Date

日期類是很常用的一個類,我們要模仿實現的就是日常生活中會用到的一些功能。 首先給出Date類的標頭檔案: class Date { friend std::ostream& operator<<(std::ostream& _

集合的模擬實現模板)

我們可以用一個類來模擬集合及集合運算,add運算用以實現集合元素的增加,delete運算用於實現集合元素的刪除,find運算用以實現集合元素的查詢,但是目前集合元素型別未知,可以是int、char、double等基本資料型別,也可以是String、Time、Student等物件型別,要求採用類模板實現集合及

string模擬實現

class String { public: typedef char* Iterator; public: String() { } String(const char* str) { if (str == nullptr) { assert(str); ret

string模擬實現

string類部分函式模擬實現 對於一些常用的string類的函式進行模擬實現,通過對一些函式的模擬是實現瞭解,其底層的實現原理,加深對於string 類中的函式的理解 建構函式 String(const char* str="")//使用預設引數

c++ string的完整實現!!!

class sun double ref basic 更新 方便 iterator locate 本文實現了c++ STL中的basic_string模板類,當然。通過typedef也就實現了string類和wstring類。限於篇幅,實現代碼中用到了標準庫的char_

用ES5模擬實現ES6中的Map

fun 遍歷 false 創建 per 映射 .get script 實例 ECMAScript6原生實現了Map類,即我們所說的字典,字典和集合很像,不過集合是以值值得形式存儲元素,字典則是以鍵值的形式存儲元素。字典也叫映射。 1. 創建一個字典 function M

模擬實現MyBites中通過SQL反射實體對象功能

println sub var void mysql exc 模擬實現 obj 執行 話不多說,直接上幹貨! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; im