C++ String 類的簡單實現
String類裡面主要包含構造,拷貝構造,析構,賦值,比較,字串相加,獲取長度及子串等方法。
#include <iostream>
#include <cstring>
using namespace std;
class String{
public:
// 預設建構函式
String(char *str = NULL);
// 複製建構函式
String(String &str);
// 解構函式
~String();
// 字串連線
String operator+(const String & str);
// 字串賦值
String& operator=(const String &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* m_data;
int m_size;
};
// 建構函式
String::String(char *str = NULL){
//空構造也會建立一個長度為1的字串陣列
if(str == NULL){
m_data = new char[1];
m_data[0] = '\0';
m_size = 0;
}
else{
m_size = strlen(str);
m_data = new char[m_size + 1];
strcpy(m_data,str);
}
}
//拷貝建構函式
String::String(const String &str){
m_size = str.m_size;
m_data = new char[m_size + 1];
strcpy(m_data, str.m_data);
}
//解構函式
String::~String(){
delete[] m_data;
}
// 字串連線
//這裡返回的不是引用,而是值
String String::operator+(const String &str){
String newStr;
//釋放原有空間
delete[] newStr.m_data;
//建立長度為兩個字串長度和的空間大小
newStr.m_size = m_size + str.m_size;
newStr.m_data = new char[newStr.m_size + 1];
strcpy(newStr.m_data, m_data);
strcpy(newStr.m_data + m_size, str.m_data);
return newStr;
}
//賦值函式
/*
這裡為什麼返回物件的引用呢?原因有兩個:①允許進行連續賦值 ②防止返回物件(返回物件也可以進行連續賦值)的時候呼叫拷貝建構函式和解構函式導致不必要的開銷,降低賦值運算子等的效率。
對於第二點原因:如果用“值傳遞”的方式,雖然功能仍然正確,但由於return語句要把 *this拷貝到儲存返回值的外部儲存單元之中,增加了不必要的開銷,會降低賦值函式的效率。
因此,如果賦值運算子返回的是物件引用,那麼其不會呼叫類的拷貝建構函式,這是問題的關鍵所在!!
*/
String& String::operation=(const char * str){
if (m_data == str){
return *this;
}
delete[] m_data;
m_size = strlen(str);
m_data = new char[m_size + 1];
strcpy(m_data, str);
return *this;
}
//判斷是否相等
bool String::operation==(const char *str){
return strcmp(m_data, str.m_data) == 0;
}
//獲取長度
int String::length(){
return m_size;
}
//求子字串[start,start+n-1]
String String::substr(int start, int n){
String newStr;
//釋放原有記憶體
delete[] newStr.m_data;
//重新申請記憶體
newStr.m_data = new char[n + 1];
for (int i = 0; i < n; i++){
newStr.m_data[i] = m_data[start + i];
}
newStr.m_data[n] = '\0';
newStr.m_size = n;
return newStr;
}
// 過載輸出
ostream & operator<<(ostream &o, const String &str){
o<<str.data;
return o;
}
相關推薦
C++string類的實現
C++中提供了一種新的資料型別——字串型別(string)。實際上string並不是C++的基本型別,它是在C++標準庫中宣告的一個字串類,用這種資料型別可以定義物件,每一個字串變數都是string類的一個物件。標準庫型別string表示可變長的字元序列,使用s
C++ string類的簡單實現 (2)
參考 分析 如果一個class帶有指標型別的資料成員,那麼請思考預設的copy ctor和copy assign是否合適。如果你需要深拷貝那麼預設的行為就不合適了(預設為淺拷貝)。並且如果你的編譯器支援c++11,可以考慮是否可以利用右值引用來提高效
C++ String 類的簡單實現
String類裡面主要包含構造,拷貝構造,析構,賦值,比較,字串相加,獲取長度及子串等方法。 #include <iostream> #include <cstring> using namespace std; class Stri
C++ String類的簡單實現1
一、String類的基本設計: String類的最簡單的設計是隻含有一個char*成員變數。<span style="white-space: pre;"> </span>&
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
【C++】C++string類總結
ont cst number 開始 RoCE 模板 tro sig def 首先,為了在程序中使用string類型,必須包含頭文件 <string>。如下: #include <string> 註意這裏不是string.h,stri
string類介面實現
namespace bit { class String { public: typedef char* Iterator; public: String(const char* str = " ") { if(str == nullptr) { assert(false);
深入C# String類
深入C# String類 C#中的String類 他是專門處理字串的(String),他在System的名稱空間下,在C#中我們使用的是string 小寫的string只是大寫的String的一個別名(外號)使用大寫和小寫都是一樣的 常用的字串
C++ string類常用的函式
字串是一種線性表,有著廣泛的應用,比如:文字編輯 、 情報檢索 、 拼寫檢查 、 網際網路搜尋引擎和自然語言翻譯等。 string append(const char *s); &n