C++學習筆記第二周(極客班)
學習C++第二周了,總體來說還不錯。
這一周學習了BigThree 拷貝構造,拷貝指派,析構
當我們設計的類中的資料包含指針時我們就應該涵蓋這三個函數如課程中的String類,
class String
{
public:
String(const char*cstr=0);//構造函數
String (const String &str);//拷貝構造
String &operator=(const String &str);//拷貝指派
~String();//析構函數
private:
char *m_data;//定義指針則可以不用事先劃出确定的空間來存放對象。
};
此時涵蓋這三個函數是為了可以正确的生成對象以及解除對象,假如使用預設的構造函數可能無法正确的構造出類對象,同樣也無法正确delete對象,造成記憶體洩露等一些列問題。
String(const String &str);該函數傳入的是常量引用,那樣函數就不會修改該對象資料;
String &String ::operator=(const String &str)
{ if(this==&str)
return *this;//當對象是自己是直接傳回對象本身,這裡通過比較兩者的位址來确定是否為自己指派自己。假如這裡缺少可能會導緻程式出錯。
delete[]m_data;//删除m_data所值的記憶體對象。假如少了上面的if語句那麼這裡删除以後對象自己指派自己就不成功了 ,因為将删除了指針所指向的記憶體,那麼記憶體中存放的資料也就丢失了。
m_data=new char(strlen(str.m_data)+1);
strcpy(m_data,str.m_data);
return *this;
}
所謂stack & heap
stack是村才與某個作用域的一塊記憶體空間。當程式調用某個函數時,該函數的參數以及傳回位址等就會存放于stack中,包括函數中的本地變量。
heap 是有作業系統提供的一塊global記憶體記憶體空間,程式可以動态的從中獲得記憶體。在C++中通過new & delete 這一對關鍵詞來配置設定和釋放記憶體。當我們通過new分的一塊記憶體時對應的就要delete[] 來釋放這塊記憶體。
stack的生命周隻是在其作用域内,離開作用域以後生命周期就結束了。如:
class Complex{…};
..
{ Complex c1;}
c1在離開上述作用域後,它的生命也就結束了。
而heap的生命周期是在對應的delete[]之後,或者整個程式結束之後。
static對象的生命周期在其作用域結束以後依然存在,直到程式結束為止。
global 對象的生命周期是整個程式結束之後。
new 對象時先配置設定記憶體然後在調用構造函數來建立對象。
delete :首先調用析構函數,然後釋放由new生成的記憶體.
static 的補充
class Account
{
public:
static double m_rate;
sratic void set_rate(cont double &x){m_rate=x;}//static 函數和static比對用于為static 對象指派
};
static double m_rate=8.0;//當類内定義了static資料成員時,類的外部必須對該static資料成員進行定義。
int main()
{
Account::set_rate(5.0);
Account a;
a.set_rate(5.0);
}
将構造函數放在private區
class A
{
public:
staticA&getInstance();
setup(){…}
private:
A();
A(const A& rhs);
…
};
A & A::getInstance()
{
static A a;
return a;
}
上面的程式也可以如下寫:
class A
{
public:
staticA&getInstance(return a);
setup(){…}
private:
A();
A(const A& rhs);
static A a;
…
};//上面的語句用于生成隻有一個對象的類。當構造函數存在于私有區域時隻能通過公有區域的static函數來通路和設定私有的static 對象.
關于模闆類
很多時候我們生成的類有很多共有的屬性此時就可以生成一個模闆類。
如
template
class complex
{
public :
complex (T r=0,T i=0) :re(r),im(i){}
complex &operator+=(const complex&);
T real ()const {return re;}
Timag()const{returnb im;}
private:
T re,im;
friend complex&_doapl (complex*,const complex &);
};
{
complex c1(2.5,3.0);
complexc2(2,6);
..
}