1. 程式人生 > >string類的實現(mystring)

string類的實現(mystring)

最近參加了實習招聘感覺自己的C++都快忘光了,其中面試過程中問到了string類的實現,需手寫實現一遍。現在再實現一下

class mystring
{
    friend std::ostream& operator<<(std::ostream& os,const mystring & str);
private :
    char * m_data;
public :
    mystring(char * str=NULL);
    ~mystring();
    mystring & operator=(const mystring & a);
    mystring(const
mystring &a); }; inline mystring::mystring(char *str=NULL) { if (str!=NULL) { m_data = new char[strlen(str)+1]; strcpy(m_data,str); }else { m_data=NULL; } } inline mystring::~mystring() { if (m_data!=NULL) { delete[] m_data; m_data=NULL; } } inline
mystring::mystring(const mystring &a)//使用靜態的防止被修改 傳入引用是避免拷貝函式再調拷貝函式導致編譯出錯 { if (a.m_data!=NULL) { m_data = new char[strlen(a.m_data)+1]; strcpy(m_data,a.m_data); } else { m_data=NULL; } } inline mystring & mystring::operator=(const mystring &a)//賦值運算子需要返回該型別的引用 這樣才能連續賦值
{ if (a.m_data!=NULL) { if (m_data==NULL) { m_data = new char[strlen(a.m_data)+1]; strcpy(m_data,a.m_data); } else { if (this == &a) { return *this; } delete []m_data; m_data = new char[strlen(a.m_data)+1]; strcpy(m_data,a.m_data); } } else { delete []m_data; m_data=NULL; } return *this; } std::ostream& operator<<(std::ostream& os,const mystring & str) { os<< str.m_data; return os; }

提醒自己需要注意的幾點:
1. 過載賦值運算子的時候,要考慮到是否為自身,即(this與&a)的比較
2. 過載賦值運算子的時候,要返回返回該型別的應用,這樣就可以實現連續賦值
3. 拷貝建構函式引數需要是引用的,因為如果引數是例項,那麼從形參到實參會呼叫一次輔助建構函式,形成無休止的呼叫,造成編譯出錯。
4. 還有沒考慮到的就是new的時候可能會出現錯誤,所以在函式中可先例項一個物件,然後再交換。

相關推薦

string實現mystring

最近參加了實習招聘感覺自己的C++都快忘光了,其中面試過程中問到了string類的實現,需手寫實現一遍。現在再實現一下 class mystring { friend std::ostream& operator<<(std::os

後臺開發閱讀筆記——STL標準模板庫的使用之string實現

string類的實現: class String { public: String(const char *str=null); String(const String &other); ~String(); String &operator =(const

模型的設計與實現

介紹 傳遞數據 規則 添加 play using ota 實體類 重要 實體類是現實實體在計算機中的表示。它貫穿於整個架構,負擔著在各層次及模塊間傳遞數據的職責。 一般來說,實體類可以分為“貧血實體類”和“充血實體類”,前者僅僅保存實體的屬性,而後者還包含一些實體間的關系與

.net中將 list<> 轉換成string1,2,3

show count var string類 得到 泛型 end append 轉換成 list<string> isShow=new List<string>() ///泛型集合 isShow.Add(‘1‘) isShow.Add(‘

32-多執行緒--概述+Thread+多執行緒的建立方式繼承Thread+實現Runnable介面+Runnable介面+執行緒的名稱+執行緒的狀態

一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為

請求第三方介面的請求的設計實現思路

       在實際開發專案中免不了的肯定會請求其他系統的介面,而使用PHP請求其他型別的介面無非就是用curl跨域請求別的專案等第三方的介面。請求介面就是使用約定的請求型別請求第三方給的介面路由,同時傳遞給其資料。但是每個請求都要重複的設定請求方式和請求地址

五子棋專案的實現人機對戰的具體設計

在之前描述了博弈樹演算法的思想,現在則是關鍵類的設計實現。在具體的過程中我們先要設計一個遍歷棋型演算法,來遍歷整個棋盤中的各種棋型   通過最後返回值的不同,來確定不同的棋型 當中有評估函式對當前的棋型進行打分。再選取區域性最優的幾個落子點作為下一步擴充套件的節點。 //bwf 棋色

String compareto方法

public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Mat

異端審判器!一個泛用型文字聚模型的實現1

給你的入侵檢測系統提供一個靈感。 如果給你一大堆使用者輸入,裡面有大量的中文地名,像是“北京”、“成都”、“東莞”,不幸的是,其中也混有一些羅馬地名,比如 “Singapore”、“New York”、“Tokyo”。你的任務是將它們分開,你會如何去做? 當然,有

C++實現日期實現Date

#include<iostream> #include<stdlib.h> using namespace std; class Date { public: //建構函式 Date(int year = 1900, int month = 1

Android開發ViewPager和Fragment結合使用實現新聞app基本成型的app

//該類為我們的標題欄的自定義View public class MyLinearLayout extends LinearLayout { public MyLinearLayout(Context context, AttributeSet attrs) { super(cont

異端審判器!一個泛用型文字聚模型的實現2

上文連結:異端審判器!一個泛用型文字聚類模型的實現(1) 上回,我們提出了一種只要輸入一堆字串,就能根據字串的構造挑揀出“少數派”,以識別異常引數的構想。我們將它稱作“異端審判”。 前文中我們已經定義好了一些必要概念,並寫出了函式實現。我們的程式遞進地量化了字元之間的差異、字串之間的差異,最終得

3.2程式設計實現 1員工Employee2部門主管Manager3測試Test

摩爾的Java學習筆記3.2 第三週作業: 1、定義學生類:成員變數有學號、姓名、出生日期(字串)、成績;成員方法包括構造方法、計算學生年齡的方法、輸出學生資訊的方法;在主方法中創造一

模糊聚演算法FCM和硬聚演算法HCM)的VB6.0實現及其應用

Private Function Fcm(ByRef Data() As Double, ByVal Cluster As Long, Optional ByVal CreateIniCenter As IniCenterMethod = IniCenterMethod.CreateByHcm, Option

單例模式封裝的logging庫的實現Python

import logging import sys def __singletion(cls): """ 單例模式的裝飾器函式 :param cls: 實體類 :return: 返回實體類物件 """ instances =

JS實現 LeetCode 陣列演算法

628. 三個數的最大乘積 給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。 分析:因為有負數的出現 有兩種結果構成最大乘數,一是三個最大正數相乘,二是一個最大正數和兩個最小負數相乘。故將陣列排序後 將上述兩種情況都進行計算 比較兩者結果大小就可求

介面interface,實現class,繼承(extends),實現implements

介面類: @Service public interface AppCertMsgService { public Map<String, Object> saveCardMsg(AppCertMsg appCertMsg, String channe

基於C#彈幕射擊遊戲的實現——渲染

這個遊戲打算是用C#+GDI做~所以渲染效率上還是要進行一些考慮的 這裡對傳統的GDI+封裝了下,通過批處理來提高一些效率 首先給出的是渲染介面的定義,方面以後更換高效能的渲染器(當然很遙遠) /// <summary> /// 渲染器介面 /

字串比較函式 StringcompareTo

Student類定義學生姓名,學號,生日,性別,院系屬性,及其get()、set()方法。 public class Student { private String name; private String number; private String borth

JS實現 LeetCode 陣列演算法

268. 缺失數字 給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。 分析:將陣列進行升序排序,沒有缺失的陣列元素應該與其下標相等,故排序後遍歷陣列,將陣列下標與元素進行比較,若不相等,則陣列