#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>的標頭檔!!!