模擬實現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