string類的實現

來源:互聯網
上載者:User

#include<iostream>
using namespace std;

class String
{
friend ostream& operator<<(ostream& out,const String& str) //輸出操作符重載
{
return str.Print(out);
}
public:
String(const char *str = 0);// 普通建構函式
String(const String &other); // 拷貝建構函式
~String(void) { delete [] data_; }// 解構函式
String& operator=(const String &other);// 賦值函數
char* data(void) const { return data_; }
private:
ostream& Print(ostream& out) const;
char *data_;// 用於儲存字串
};

//賦值操作符首先要注意是不是自己賦給自己,如果是這樣的話什麼也不做,把自己返回即可。

//其次就是別人賦值給自己,這時首先要自己把原來的值扔到,根據別人的大小開闢一塊空間

//準備盛放別人的內容,最後不要忘了返回對自己的引用。

String& String::operator =(const String& other)
{
if(this!=&other)
{
delete [] data_;
size_t length=strlen(other.data());
data_=new char[length+1];
strcpy_s(data_,length+1,other.data());
}
return *this;
}

//複製建構函式總是發生在構造階段,所以此時成員data_還沒有空間可以使用,應該先根據別

//人空間的大小開闢好空間,然後在把別人的內容拷貝進來。

String::String(const String &other)
{
size_t length=strlen(other.data());
data_=new char[length+1];
strcpy_s(data_,length+1,other.data());
}

//由於輸出操作符通常寫成類的友元函數,這樣就可以寫類似cout<<s;如果不是這樣使用起來就會

//很奇怪,比如可能是s.print()之類,無法像cout<<s<<s1<<endl;那樣和標準庫完美結合,甚至如果

//你寫了一個ostream& operator<<(ostream& out,const String& str)忘了加上友元聲明,編譯器

//會認為你是重載了一元移位操作符<<,而且參數還加多了。

//輸出操作符的經典寫法就像本文這樣,另加一個Print成員函數來完成幹活的功能讓<<來調用,之所

//以返回ostream& 也是和C++語言內建操作符機制保持一致,這樣就可以寫cout<<s<<s1<<endl;而不是

//cout<<s;cout<<s1;cout<<endl;

ostream& String::Print(ostream& out) const
{
out<<data_;
return out;
}

//此建構函式可以支援隱式類型轉換比如你可以這樣建立一個String對象 String s("Hello World !");此語句

//就是在調用這個建構函式,另外String s="Hello World !";會被解釋成String s=Sting("Hello World !");先

//根據字元數組構造一個臨時String對象(此對象在這條語句執行完之後就被析構),並緊接著調用String的賦值

//操作符重載函數

String::String(const char *str) // 6分
{
if(str==NULL)
{
data_=new char[1];// 若能加 NULL 判斷則更好
*data_='\0';
}
else
{
size_t length = strlen(str);
data_ = new char[length+1]; // 若能加 NULL 判斷則更好
strcpy_s(data_,length+1, str);
}
}

void main()
{
char* p="Hello World !";
String s(p);
cout<<s<<endl;
String s1("How are you ?");
cout<<s1<<endl;
s1=s;
cout<<s<<endl<<s1<<endl;
s=s=s1;
cout<<s<<endl<<s1<<endl;
}

------------

好丟臉啊,我竟然以為strcpy是為string定製的.......

其實它是char *複製的!!!!!

strcpy系列根本就不用加<string.h>的標頭檔!!!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.