程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 詳解C++中完成繼續string類的MyString類的步調

詳解C++中完成繼續string類的MyString類的步調

編輯:關於C++

詳解C++中完成繼續string類的MyString類的步調。本站提示廣大學習愛好者:(詳解C++中完成繼續string類的MyString類的步調)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++中完成繼續string類的MyString類的步調正文


昨天師兄又出了道測試題,讓我們完成相似於string類的沒有MyString類,剛開端很頭疼,可是真正在本身寫代碼的時刻又很高興的發明,這個進程真的是個很名貴的機遇,讓我又無機會可以很好的熟習回想C++的許多常識—類設計,結構析構函數,成員函數,友元函數,援用,重載,字符串操作,靜態內存散布。。。。。因而昨天花了半地利間寫了300多行代碼,並賣力的停止了相干測試、修正和總結。由於內容有點豐碩,所以想分幾回寫出來,層次也清晰些。

類的空間分派:類給它的每一個對象都分派了自力的空間去存儲它的數據成員,一切的對象公共的拜訪類辦法停止操作。同時在對象的自力空間中,不包含數據成員靜態分派的空間,對象只是記載了靜態分派空間的地址(所以在析構函數挪用的時刻只是刪除對像空間,同時須要用new來刪除靜態分派的地址)。

1、類聲明—mystring.h:
1. 結構函數:
專門用於構建新對象,給成員數據分派需要的內存空間並將值賦給新對象的成員數據。
默許結構函數:
在未供給顯式初始化值時,被用來創立對象的結構函數(所以它普通沒有參數)

MyString();

復制結構函數:
用於將一個對象復制到新創立的對象中(固然這個被復制的對象必需曾經存在)。

MyString(const MyString &str);

給定了必定初始化參數的結構函數:
參數列表中的值會一次賦給新創立對象的各個成員函數:

MyString(const char*str);

2.析構函數:
當對象過時時刪除對象所占的內存空間,而且當對象創立時有效New要求的內存空時,在析構函數中同時要挪用delete對本來分派的 內存空間停止釋放,以避免內存洩漏。
~MyString();

3.成員函數:
重載賦值成員函數:

MyString &operator=(const MyString &str);    //應用已有的string對象經由過程=給一個對象停止賦值
MyString &operator=(const char*str);       //直接用常量字符串停止賦值

普通賦值函數:

MyString &assign(const MyString&str);
MyString &assign(const char*sstr);

幾個處置字符串的成員函數:

size_t getsize()const;                  //前往字符串年夜小
void clear();                      //把字符串清空
bool empty();                       //斷定字符串能否為空
void swap(MyString &str);              //交流兩個字符串
int compare(const MyString &str)const;      //比擬2個字符串的年夜小
//第一個const解釋顯式挪用的字符串弗成更改,括號裡面的const解釋隱式挪用的字符串弗成更改,只讀數據    
int compare(const char*str);           

追加函數:

MyString &operator+=(const MyString&str);
MyString &operator+=(const char*str);
MyString &append(const MyString&str);
MyString &append(const char *str);

生成字串:

MyString substr(size_t pos = 0,n=npos) const; 
生成字串,從第0個地位開端長度為n,若N跨越長度,則為輸入全部字符串的長度

4.友元函數(運算符重載):
友元函數普通都是在類得聲明中停止界說,它不屬於類得成員函數,然則它和類得成員函數一樣異樣的可以對類得一切數據成員停止拜訪。

friend bool operator==(const MyString &str1,const MyString &str2);
friend bool operator==(const char *str,const MyString &str2);
friend bool operator==(const MyString &str1,const MyString *str2);
friend bool operator>(const MyString &str1,const MyString &str2);
friend bool operator>(const char*str1,const MyString &str2);
friend bool operator>(const MyString &str1,const char*str2);

異樣還有<等各類比擬。

friend MyString operator+(const MyString &str1,const MyString &str2);
friend MyString operator+(const char*str1,const MyString &str2);      //兩個字符串停止相加
friend MyString operator+(const MyString &str1,const char*str2);

friend ostream & operator<<(ostream &os,const MyString &str);       //輸入敕令符的重載

5.成員數據變量:

char *string;                     //指向字符串的指針
int length;                       //字符串的長度
static const int string_number = 0;      //計數創立的字符串的數量

2、完成.cpp文件:
1.結構函數和析構函數:

MyString::MyString() 
{ 
  length = 0; 
  string = new char; 
  char *s = "/0"; 
  memcpy(string,s,1); 
  ++string_number; 
} 
 
MyString::MyString(const char*str) 
{ 
  length = strlen(str); 
  string = new char(length+1); 
  memcpy(string,s,length); 
  ++string_number; 
} 
MyString::MyString(MyString &str) 
{ 
  length = str.length; 
  string = str.string; 
  ++string_number; 
} 
 
MyString::~MyString() 
{   
  delete[]string; 
  --string_number; 
} 

幾個留意的成績:
1)結構函數中必需給一切的數據成員停止初始化。
2)留意在給指向字符串的指針賦值時,閣下類型的對應。
char *s代表一個指向字符串的指針,一切左邊必需是一個字符串常量“/0”,而不克不及是‘/0'.
3)一個指針只能指向一個地址,不克不及同時指向兩個。
在給string分派了地址以後,下一步我們確定是肯定分派的地址中寄存的詳細內容,那末這個時刻我們都是應用strcpy()或許是
memcpy()把對應的字符串存上天址中。
假如本來我們成如許完成:

   MyString::MyString()
  {
    length = 0;
    string = new char;
    string = "/0";
    ++string_number;
  }

那末我們在編譯和完成的時刻都不會發明有甚麼錯,然則析構函數應用delete【】釋放內存使履行成果會湧現亂碼,由於string=“/0”
讓它指向了一個字符串,並沒有分派內存空間,所以在釋放的時刻就會湧現毛病。
4)析構函數中的主要語句 delete【】不要忘
析構函數在應用的時刻只會釋放為對象分派的空間,然則對象的空間中只是存儲了數據成員分派內存的地址,所以並沒有釋放數據成員
的內存空間,必需應用delete[]來停止釋放,避免內存洩漏 
2.重載運算符的成員函數:

MyString &MyString::operator+=(const MyString&str) 
{ 
   char *dest; 
   dest = new char[str.length+length+1]; 
   memcpy(dest,string,length); 
   memcpy(dest+length,str.string,str.length+1); 
   delete[]string; 
   length = length+str.length; 
   string = dest; 
   return*this; 
} 
MyString &MyString::operator+=(const char*str) 
{ 
   char *dest; 
   dest = new char[strlen(str)+length+1]; 
   memcpy(dest,string,length); 
   memcpy(dest+length,str,strlen(str)+1); 
   delete[]string; 
   string = dest; 
   return *this; 
} 
 
 //字符串賦值 
MyString &MyString::operator=(const MyString&str) 
{ 
  if(&str == this) 
    return *this; 
  delete[]string; 
  string = new char[str.length]; 
  memcpy(string,str.string,str.length); 
  length = str.length; 
  return *this; 
} 

 
留意的幾個問題:
1)+=運算中,挪用函數的對象終究字符串長度確定年夜於其本來的長度,所以在這個函數挪用進程中,我們必需給字符串從新分派一塊
兩個字符串長度和年夜小的內存區域。然則由於函數前往值又必需是原挪用對象的援用,所以我們要界說一個中央變量指針來存儲2個
字符串歸並成果,最初釋放string指針本來的內存區域後,再讓它指向歸並字符串。
2)“=”賦值運算確定和結構函數的初始化紛歧樣。
在應用這個辦法之前,那末對象確定至多曾經經由過程挪用結構函數數據成員有了必定的值。所以這個時刻我們起首斷定兩個對象能否
相等。相等的話前往原對象,假如不等:
那末兩個對象的字符串長度確定分歧。所以我們先釋放原字符串內存空間,然後依據賦值對象的字符串長度分派內存空間並把字符
串內存拷貝曩昔。
3.字符串處置的幾個函數:

size_t MyString::getsize(MyString &str) 
{ 
 return strlen(str.string); 
} 
void MyString::clear() 
{ 
 length = 0; 
 while(string!='/0') 
 *string ='/0'; 
} 
bool MyString::empty() 
{ 
 return strlen(string)==0; 
} 
int MyString ::compare(const MyString &str) 
{ 
  return compare(string,str.string); 
} 
void MyString::swap(MyString &str) 
{ 
  char *temp; 
  temp = string; 
  string = str.string; 
  str = temp; 
} 
Mystring MyString::substr(sizez_t pos=0,size_t n )const 
{ 
  MyString string; 
  delete[]string.string; 
  if(n>length) 
  { 
   string.length = length; 
   string.string = new char[length+1]; 
   memcpy(string.string,string,length+1); 
    return string; 
  } 
  length = n; 
  string.string = new char[length+1]; 
  memcpy(string.string,string,length+1); 
  return string; 
} 

留意的幾個成績:
1)在這幾個函數的完成中,我們可以直接挪用c說話中幾個對字符串處置的<string.h>函數停止完成
2)clear()函數中留意,只是把每一個內存區域的字符置為0,其實不能經由過程delete[]來釋放內存空間,如許很輕易和析構函數一路形成
兩次釋放內存空間惹起毛病。
3)swap()完成交流的這個函數中,我們可以直接界說中央變量指針完成,不消從新分派內存空間全體停止轉存,這個關於析構函數
的析構沒有影響。
4.友元函數:

friend bool operator==(const MyString &str1,const MyString &str2) 
 
  return strcmp(str1.string,str2.string)==0; 
 
friend MyString operator+(const MyString &str1,const MyString &str2) 
{ 
  MyString mystring; 
  char *dest; 
  dest = new char[str1.length+str2.length+1]; 
  memcpy(dest,str1.string,str1.length); 
  memcpy(dest+str1.length,str2.string,str2.length+1); 
  delete[]mystring.string; 
  mystring.string = dest; 
  mystring.length = str1.length+str2.length; 
  return mystring; 
} 
friend ostream &operator<<(ostream &os,const MyString &str) 
{ 
  os<<str.string; 
  return os; 
} 

留意的成績和下面差不多,這裡就不反復了~~~
其他幾個函數完成都根本相同~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved