C 類物件共享資料的5種實現方法

2021-09-08 17:58:03 字數 2768 閱讀 2648

c++中實現資料共享的5種方式:

1.      使用區域性變數和全域性變數共享資料

使用區域性變數能夠在呼叫和被呼叫函式之問通過引數傳遞實現不同函式塊之問的資料共享。區域性變數具有區域性作用域,能很好地實現函式之間的資料隱蔽。但在傳遞過程中需要很大的系統開銷,故一般只用於傳遞少量的資料。全域性變數具有檔案作用域。全域性變數所儲存的資料在程式中任何地方都可以訪問,能夠在程式中的所有函式之間實現資料共享。使用全域性變數實現共享資料相當方便,但其***也相當大。因為全域性變數無法對資料的訪問權進行有效控制。也就是說,我們很難知道程式中資料在那些函式中共享,這樣一旦共享的資料發生結構性調整,也就很難判斷它到底影響到哪些函式,從而給程式維護帶來相當大的困難。這種共享方式,直接影響到資料安全、程式**重用和擴充。所以,在程式設計中,應可能少的使用這種共享方式。

2.      通過類的資料成員共享資料

c++中類內部封裝的資料成員提供了同一類的函式成員之間進行資料共享機制 j。這種共享方式一方面實現了類內部函式的全面共享,同時也提供了通過設定適當的訪問控制屬性,把共享只限制在類的範圍之內,這樣對類外來說,類的資料成員仍是隱藏的,達到了共享與隱藏兩全,解決了全域性變數和區域性變數所無法克服的矛盾。

例如:乙個時鐘類,該類中封裝了私有資料成員有hour,minute,second,在類的成員函式之間實現資料共享。在類的外面,對它們的訪問只能通過類自身提供的外部介面進行,無法直接訪問。

class clock//時鐘類的宣告

;3.      通過類的靜態成員實現資料共享

c++中使用靜態成員可以實現同一類的不同物件之間共享資料 j。類的普通資料成員在類的每乙個物件都有乙個拷貝,就是說每個物件的同名資料成員可以分別儲存不同數值,這就保證物件擁有自身區別其他物件的特徵的需要。靜態資料成員是類的資料成員的一種特例,採用static關鍵字來宣告;每個類只有乙個拷貝,由該類的所有物件共同維護和使用,從而實現了同一類的不同物件之間的資料共享。

例如:#include

using namespace std;

class sample

sample(sample & s)

void show(void)

void input(void)

};char sample::m_sarray[10] = "i am a engineer";

int main(void)

執行結果如下:

default constructor!

i am a engineer

copy constructor!

i am a engineer

this is my job

this is my job

靜態成員變數m_sarray確實起到了在不同物件間共享的作用!不過由於其是靜態屬性,記憶體是在全域性/靜態區域開闢的,屬於棧記憶體區,記憶體大小使用受限。如果能動態從堆中申請記憶體,則可以使用大記憶體空間了。

有一學生類:

class engineer

如果程式中需要統計學生人數,這個資料存放在什麼地方呢?若以類外的全域性變數來存放,不能實現資料的隱藏,若在類中增加乙個資料成員用以存放人數,必然在每乙個物件中都儲存一副本,這樣不僅冗餘,而且每個物件分別維護乙個「人數」,勢必造成資料的不一致性。因此,比較好的方案是在engineer類中增加乙個靜態資料成員。static count用來存放學生「人數」。

4.      通過友元機制共享資料

在乙個類中,可以利用關鍵字friend將別的模組(一般函式、其他類的成員函式或其他類)宣告為它的友元,這樣這個類中本來隱藏的資訊就可以被友元訪問j。如果友元是一般函式或類的成員函式,稱為友元函式;如果友元是乙個類,則稱為友元類,友元類的所有成員函式都成為友元函式。

例如:class b

;在b類宣告f函式為友元函式,則在f函式中通過物件名可直接訪問b類所有的資料成員。同時在b類宣告a類為友元類,則a類的所有成員函式都是b類的友元函式,都可以訪問b類的私有和保護成員。採用友元類共享資料機制,使友元類成員函式可以通過物件名直接訪問到隱藏的資料,從而使程式達到高效協調工作。在較為複雜的問題中,實現不同類之間的資料共享,友元類的使用也是必不可少的選擇。友元在類之間、類與普通函式之間共享了內部封裝的資料的同時,必然會對類的封裝性帶來一定的破壞。因此在程式設計中使用友元,要在共享和封裝之間找到乙個恰當的平衡點,從而達到提高程式效率同時,將程式隱患降來最低。

5.      指標成員變數與計數

#include

using namespace std;

class sample

sample(int n)

sample(sample & s)

else

}~sample()

}sample & operator=(const sample &s)

m_parray = s.m_parray;

m_size = s.m_size;

m_scount++;

}void show(void)

void input(void)

cin.get(m_parray, m_size);}}

};int sample::m_scount=0;

int main()

執行結果如下:

default constructor!

copy constructor!

i am a engineer

i am a engineer

在大型程式設計中資料共享問題是乙個複雜的綜合性問題。設計過程中既要實現資料共享,又要保證共享資料的安全。這就要求程式設計人員必須充分了解各種實現機制的執行場合,熟知運用它們所帶來的利與弊,這樣才能恰到好處地運用這些機制,設計出高質量程式。

C 類物件共享資料的5種實現方法!

c 類物件共享資料的5種實現方法 c 中實現資料共享的5種方式 1.使用區域性變數和全域性變數共享資料 使用區域性變數能夠在呼叫和被呼叫函式之問通過引數傳遞實現不同函式塊之問的資料共享。區域性變數具有區域性作用域,能很好地實現函式之間的資料隱蔽。但在傳遞過程中需要很大的系統開銷,故一般只用於傳遞少量...

C 類物件共享資料的兩種實現方法

c 中類對資料與行為做了封裝,使得私有資料成員不能在類體外被訪問,同時類物件之間也不能互相訪問對方的私有成員,而在有些情況下,資料既需要保持其私有性,又需要其有共享性,以下將給出兩種方式的實現。一 靜態成員變數 include using namespace std class sample sam...

C 語法(類,,類的物件,方法)

一 類 語法 class 類名 二 建立類的物件 語法 a 建立物件 例項化物件 類名 物件名 new 類名 b 呼叫屬性 物件名.屬性名 c 呼叫方法 物件名.方法名 三 類的方法 1 普通方法 語法 訪問修飾符 返回值 方法名 引數列表 2 構造方法 初始化欄位用的 定義 構造方法名稱和類名相同...