1. 程式人生 > >C++ String類的簡單實現1

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++編譯系統會自動呼叫的一種成員函式。
<span style="white-space:pre">	</span><pre name="code" class="cpp">	~String(){
		if (_str != NULL){
			delete[] _str;
			_str = NULL;
		}
	}
3、拷貝建構函式:建立物件時使用同類物件來進行初始化,這是使用的建構函式成為拷貝建構函式;拷貝建構函式是特殊的建構函式。
<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);