C++ String類的簡單實現1
一、String類的基本設計:
String類的最簡單的設計是隻含有一個char*成員變數。
<span style="white-space: pre;"> </span><pre name="code" class="cpp"> String(char * str = "")
:_str(new char [sizeof(str) + 1]){
strcpy(_str, str);
}
二、實現最基本的構造、析構、拷貝構造、賦值幾種最基本成員函式:
1、建構函式:<span style="font-family: Arial, Helvetica, sans-serif;">成員變數為私有的,要對其進行初始化,必須用一個共有成員函式來進行。同時這個函式應該有且僅有在定義物件時自動執行一次(建構函式不可以顯示呼叫)</span>
<pre name="code" class="cpp"> String(char * str = "")
:_str(new char [sizeof(str) + 1]){
strcpy(_str, str);
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
2、解構函式:當一個物件生命週期結束時,C++編譯系統會自動呼叫的一種成員函式。
3、拷貝建構函式:建立物件時使用同類物件來進行初始化,這是使用的建構函式成為拷貝建構函式;拷貝建構函式是特殊的建構函式。<span style="white-space:pre"> </span><pre name="code" class="cpp"> ~String(){ if (_str != NULL){ delete[] _str; _str = NULL; } }
<pre name="code" class="cpp"> 傳統寫法:
<span style="white-space:pre"></span><pre name="code" class="cpp"> String(const String &str) :_str(new char[(sizeof(str._str) + 1)]){ strcpy(_str, str._str); }
經過改進之後的寫法:<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="white-space:pre"></span><pre name="code" class="cpp"> String(const String &str)
:_str(NULL){
String temp(str._str);
swap(_str,temp._str);
}
4、賦值函式:該函式屬於預算福過載函式中的一類(operator=)
<span style="white-space:pre"> </span>傳統寫法:
<pre name="code" class="cpp"><span style="white-space:pre"> </span>String& operator=(const String& str){
if ( this != &str){
delete[] _str;
_str = new char[sizeof(str._str) + 1];
strcpy(_str, str._str);
}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>改進後的寫法:<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="white-space:pre"></span><pre name="code" class="cpp"> String& operator=(String str){
swap(_str, str._str);
return *this;
}
5、其他的幾個常用的函式的實現:
<pre name="code" class="cpp"> <span>public</span>:
<span style="white-space:pre"></span><pre name="code" class="cpp"> bool operator==(const String & s){
if (SameStr(_str,s._str))
return true;
else
return false;
}
bool operator>(const String & s){
if (Compare(_str, s._str))
return true;
else
return false;
}
bool operator<(const String & s){
return ((_str > s._str));
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<span style="white-space:pre"></span><pre name="code" class="cpp"> bool SameStr(const char* s1, const char* s2){
assert(s1);
assert(s2);
while ((*s1) == (*s2)){
s1++;
s2++;
if ((*s1 == '\0') && (*s2 == '\0'))
return true;
}
return false;
}
bool Compare(const char *s1, const char *s2){
assert(s1);
assert(s2);
int ret;
while (*s1++ == *s2++)
ret = *s1 - *s2;
if (ret > 0)
return true;
else
return false;
}
三、總結:
1、為了保證程式碼的一致性應該儘量是new type[](delete [])只出現在構造(析構)函式中,這樣寫方便以後對程式碼的維護工作。
2、在寫operator=()的傳統寫法時,一定要注意記憶體洩露的問題,並且需要對自幅值的處理。
3、在寫operator=()的改進寫法時,應該注意在初始化列表中對_str的初始化,否則程式將會面臨崩潰的危險。
4、應該注意對庫函式的使用。<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>
相關推薦
C++string類的實現
C++中提供了一種新的資料型別——字串型別(string)。實際上string並不是C++的基本型別,它是在C++標準庫中宣告的一個字串類,用這種資料型別可以定義物件,每一個字串變數都是string類的一個物件。標準庫型別string表示可變長的字元序列,使用s
C++ String類的簡單實現1
一、String類的基本設計: String類的最簡單的設計是隻含有一個char*成員變數。<span style="white-space: pre;"> </span>&
C++ string類的簡單實現 (2)
參考 分析 如果一個class帶有指標型別的資料成員,那麼請思考預設的copy ctor和copy assign是否合適。如果你需要深拷貝那麼預設的行為就不合適了(預設為淺拷貝)。並且如果你的編譯器支援c++11,可以考慮是否可以利用右值引用來提高效
C++ String 類的簡單實現
String類裡面主要包含構造,拷貝構造,析構,賦值,比較,字串相加,獲取長度及子串等方法。 #include <iostream> #include <cstring> using namespace std; class Stri
c++string類的簡單實現
本文只是實現String的一些簡單功能,實現建構函式、拷貝建構函式、賦值函式、解構函式這幾個非常重要的部分。因為String裡涉及動態記憶體的管理,這時就要求程式設計師自己實現這些函式進行深複製,即不止複製指標,需要連同記憶體的內容一起復制,解構函式釋放對應的記
c++ string類的完整實現!!!
class sun double ref basic 更新 方便 iterator locate 本文實現了c++ STL中的basic_string模板類,當然。通過typedef也就實現了string類和wstring類。限於篇幅,實現代碼中用到了標準庫的char_
C# interface 類簡單案例實現方法
今天沒什麼事,突然想起來java 的interface介面類 。在C# 我寫程式的時候很少用,今天突然想起來研究了一下! 邏輯方法幾乎一樣的 ,簡單的一個三成架構 可能以後還會忘記先留一個筆記吧! 軟體:vs2008 動軟程式碼生成器自動資料sql 架構 窗體載入
C++ String類的建構函式、拷貝建構函式的實現
建構函式、解構函式與賦值函式是每個類最基本的函式,在一些公司的面試中也會經常問到這方面的問題。每個類只有一個解構函式和一個賦值函式,但可以有多個建構函式(包含一個拷貝建構函式,其它的稱為普通建構函式)。對於任意一個類A,如果不手動編寫上述函式,C++編譯器將自動為類A生成四
C++筆試題之String類的實現
能夠準確無誤地編寫出String類的建構函式、拷貝建構函式、賦值函式和解構函式的面試者至少已經具備了C++基本功的60%以上! 在這個類中包括了指標類成員變數m_data,當類中包括指標類成員變數時,一定要過載其拷貝建構函式、賦值函式和解構函式,這既是對C++程式設計師的基本要求,也是《Effective C
C++面試中經常會讓手寫String類的實現
主要是完成String類的建構函式、拷貝建構函式、賦值建構函式和解構函式。這個類中包括了指標類成員變數m_data,當類中包括指標類成員變數時,一定要過載建構函式、賦值函式、解構函式; 下面是具體的實
C++ String類過載運算子的實現
本篇文章僅供參考,還望各位指出不足,哈哈哈哈//標頭檔案#ifndef string_H#define string_H#include <assert.h>using namespace std;class String{friend bool operator
C++ string 類 部分成員函式實現(實現COW copy-on-write)
雖然標題中說實現了COW,但是事實上是很浪費的,並且命名也很不標準,程式碼也非常小學生,畢竟初學(給自己找藉口.jpg),以後應該還會把這篇找出來認真修改一下的。 Mystring.h: #pragma once #ifndef _MYSTRING_H_ #define
C++string類用法
last emp 進行 iii str2 line rep har ddd 1.string類的輸入操作(string類重載運算符operator>>用於輸入,同樣重載運算符operator<<用於輸出操作)operator是C++的關鍵字,它和運算
C++ 用類封裝實現隊列
pan pub pre () turn ear als sin push 1 #include<stdlib.h> 2 #include <iostream> 3 using std::cout; 4 using std::end
c++String類
... getchar() 子串 ins ted 類型 num ron .com C++ 標準庫提供了 string 類類型,支持上述所有的操作,另外還增加了其他更多的功能。我們將學習 C++ 標準庫中的這個類,現在讓我們先來看看下面這個實例: 現在您可能還無法透徹地理解這
C++string類總結
signed align 初學 獲取 amp hello tail 即將 -h 一、string的初始化 首先,為了在程序中使用string類型,必須包含頭文件 <string>。如下: #include <string> 註意這裏不是st
.net中將 list<> 轉換成string類型(1,2,3)
show count var string類 得到 泛型 end append 轉換成 list<string> isShow=new List<string>() ///泛型集合 isShow.Add(‘1‘) isShow.Add(‘
【C++】C++string類總結
ont cst number 開始 RoCE 模板 tro sig def 首先,為了在程序中使用string類型,必須包含頭文件 <string>。如下: #include <string> 註意這裏不是string.h,stri
JS-簡單實現1
正在xiaoxi JS的小白偶然看到部落格中一個關於jquery的小專案,於是拿來學習,然後自己用js初步實現了一下,可是小白畢竟還是小白…… 參考連結https://blog.csdn.net/dapyandxpy/article/details/73350506謝大佬 jque
string類介面實現
namespace bit { class String { public: typedef char* Iterator; public: String(const char* str = " ") { if(str == nullptr) { assert(false);