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

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