C 類和動態記憶體分配

2021-10-19 08:02:12 字數 1873 閱讀 8408

如果有這樣的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...