Hello!大家好,距離上次寫筆記也依即一個禮拜多了,那我這次邀要跟大家分享甚麼呢!一樣是關於類(class)的操作,止不過這次是細化一點,上次所說的類(class)的public與private,主要是談class的封裝性以及基類的安全性,而此次的重點放在在有指針的class中,必須要了解的Big Three法則,一樣家若是有甚麼地方覺得錯誤或是解釋的不是很恰當,都可以跟我說,或是qq給我,我都可以跟大家討論關於電腦的事物。
而這次所要說的Big Three是什麼呢!就是在帶有指針的class中必須要有的三個函數:拷貝函數、拷貝賦值、析構函數。而這三個特性,我會一一的在下面講解,我們先來看看為何一定要加這三個函數呢!
我們知道在一般的class之間若是沒有利用到指針的話,我們在建立class時就只需要設計出件構函數就可以了,為何?因為在摩有指針的class中,class所利用的內存會在使用端的作用域時跟著一起結束,所以在最後是不是要釋放他就顯得不是這麼重要,因為他最後都會消失,就算加上析構函數也是幫助不大,而相比帶有指針的class就不同,因為帶有指針的class被應用的時候,指針是指向一個內存空間,內存會在結束的時候釋放,但是指針不會,所以才設計出析構函數,用以釋放指針,而拷貝函數和拷貝賦值可以視為一種賦值操作
拷貝函數
inline
String::String(const String &str)
{
m_data=new char[strlen(str)+1];
strcpy(m_data,str.m_data);
}
設計思路就是新創一個大小與想要拷貝的對象相同的內存,再將其字符複製過去
拷貝賦值
inline
String::String operator +(const String &str)
{
if(this==&str)
{
return *this; //自我檢測
}
delete[]m_data;
m_data=new char[strlen(str)+1];
strcpy(m_data,str.m_data);
return *this;
}
設計思路與拷貝函數有點相似,就是多了自我檢測與刪除一次指針,自我檢測是為了怕自我賦值,因為自我賦值是一個東西自我賦值拷貝會造成兩個指針指向同一個內存,而
刪除一次指針是為了重新給他一個內存空間
析構函數
inline
String::~String
{
delete[] m_data;
}
設計須注意要加上[],因為array new必須array delete,所以為了安全性,就都加上[]