如果有這樣的strbad類:
#include#ifdef strbad_h_
#define srebad_h_
class strbad
#endif
#include#include"stringbad.h"
using std::cout;
int strbad::num=0;//靜態成員變數不能在宣告中初始化
//除非靜態變數是const或者列舉型
strbad::strbad(const char *s)
strbad::strbad()
strbad::~strbad()
std::ostream & operator<<(std::ostream &os,const strbad &st)
有些類成員是使用new初始化的、指向資料的指標,而不是資料本身,因此我們需要深度複製(改寫預設複製建構函式)。
當然我們也要過載賦值運算子。
strbad b;
b=a;//不會觸發複製建構函式,需要過載=
有以下注意點:
(1)目標物件可能引用了以前分配的資料,函式應使用delete來釋放它們。
(2)函式應當避免將物件賦給自身,否則可能會導致在賦值前刪除了自身的內容。
(3)函式返回乙個指向呼叫物件的引用。
strbad & strbad::operator=(const strbad& st)
如果賦值為str=0,這說明str為空指標,此時使用delete str是可行的。
可以將成員函式宣告為靜態的,這樣就不能通過物件呼叫靜態成員函式,甚至不能用this,靜態成員函式也不與特定的物件相關聯,因此只能使用靜態資料成員。
有如下注意點:
(1)如果在建構函式中用new,應該在析構函式中用delete。
(2)new和delete必須相容,new對應delete,new對應delete
(3)如果有多個建構函式,則必須用相同的方法new,要麼都帶中括號,要麼都不帶,因為只有乙個析構函式。delete(無論有沒有中括號)都可以用於空指標(0,null)
(4)應定義乙個複製建構函式。
(5)應過載乙個賦值運算子。
對於定位new運算子,有如下注意點:
pc1=new(buffer) strbad;
pc2=new(buffer) strbad;//no
pc2=new(buffer+sizeof(strbad)) strbad("aaa");//yes
再執行buffer的delete操作前,需要顯式地呼叫析構函式:
pc1->~strbad();
pc2->~strbad();
delete buffer;//這樣才算完全銷毀
1.返回指向const物件的引用
如果函式返回傳遞給它的物件,可以通過返回引用來提高效率,因為返回引用不會呼叫複製建構函式。而且,引用指向的物件應該在呼叫函式執行時存在。除此以外,返回的型別必須為const才能匹配。
2.返回指向非const物件的引用
兩種常見的情形是,過載賦值運算子和cout一起使用的<<。前者是提高效率,後者是必須那麼做。
3.返回物件
如果被返回的物件是被呼叫函式中的區域性變數,則不應按引用方式返回它。此時將使用複製建構函式來生成返回的物件。
4.返回const物件
net=force1+force2;
force1+force2=net;//返回const物件將不允許那麼做
使用const能夠防止那樣奇怪的錯誤,當然返回的物件將會是const的。 C 類和動態記憶體分配
預設析構函式 複製建構函式 賦值運算子 位址運算子 ifndef zhumeng h define zhumeng h include class zhumeng endif include zhumeng.h int zhumeng numm 0 zhumeng zhumeng zhumeng z...
類和動態記憶體分配
part 1 靜態類成員特點 無論建立了多少物件,程式都只建立乙個靜態類變數副本。也就是說,類的所有物件共享乙個靜態成員。靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化。初始化時使用作用域運算子來指出靜態成員所屬的類。但如果靜態成員是const整數型別或列舉型,則可以在類宣告中初始化。par...
類和動態記憶體分配
整理自 c primer plus vector force1 50,60 vector force2 10,70 vector max max max force1,force2 version1 vector max const vector v1,const vector v2 version...