第二講 類的封閉性

2021-06-14 03:18:48 字數 2980 閱讀 5226

定義乙個結構型變數實際上定義了可用於儲存與某物件的多個屬性相關的多個普通變數,但結構型變數在使用時有問題。語句struct student zhang3 = ;在語法上沒有問題,但在邏輯上已經出現錯誤了,因為,張三同學的性別不能取值為3,出生日期也不可能為2023年20月-3日。怎樣防止結構型變數中有意義的成員變數被賦值為非法的資料呢?

程式中可以隨意使用成員變數,規定每次賦值時都必須進行資料合法性檢查只有理論上的可行性,怎樣保證每個人都會遵守呢?必須通過機制保證在每次向成員變數賦值時都進行資料合法性檢查。

c++中結構型被公升級為類,用類定義的變數稱為物件。類中的成員變數有訪問限制,用關鍵字private修飾的成員稱為私有成員,不能在類外的程式中直接訪問。測試程式如下:

#include

class student

private:

char name[10];

int ***; //1為男0為女

int year;

int month;

int day;

float grade;//英語成績

int main()

student zhang3;

scanf("%s",zhang3.name);

return0;

編譯時會出現下面的錯誤:

f:\c語言程式示例\cpp\02\02.cpp(15) : errorc2248: 'name' : cannot access private member declared in class 'student'

不能在程式中直接訪問,自然就不可能被賦值為非法資料,但也不能用合法資料賦值哦,怎麼使用呢?

與c語言中的結構型相比,c++中的類可以有成員函式。成員函式就函式,但與普通函式相比,其名字比較特殊,這點與類中的成員變數相似。c++保證類中的成員變數不會被賦值為非法資料的機制:

1)把類中的成員變數設定為私有,使其在程式中不能直接訪問。

2)把類中的成員函式用public修飾,設定為公有,允許其在程式中使用。為物件中的成員變數賦值時只能通過公有的成員函式,而在成員函式中將會檢查資料的合法性。

測試程式如下:

#include

#include

class student

public:

void setdata(char *pname, int se, int ye,int mo, int da, float gr)

strcpy(name, pname);

if(se==0 || se==1)

*** = se;

else

*** = 1;

if(ye>0)

year = ye;

else

year = 2000;

if(mo>0 && mo<13)

month = mo;

else

month = 1;

if(da>0 && da<31)

day = da;

else

day = 1;

if(gr>=0 && gr<=100)

grade = gr;

else

grade = 0;

void showmessage()

printf("姓名:%s\n", name);

printf("性別:%s\n", ***==1 ? "男" : "女");

printf("出生日期:%d年%d月%d日\n",year, month, day);

printf("英語成績:%.1f\n", grade);

private:

char name[10];

int ***; //1為男0為女

int year;

int month;

int day;

float grade;//英語成績

int main()

student zhang3;

int i;

char name[10];

int ***, year, month, day;

float grade;

for(i=1; i<=2; ++i)

printf("請輸入張三的資訊\n");

scanf("%s", name);

scanf("%d", &***);

scanf("%d%d%d",&year, &month, &day);

scanf("%f", &grade);

zhang3.setdata(name, ***, year,month, day, grade);

zhang3.showmessage();

return 0;

程式的運算情況如下:

請輸入張三的資訊

zhang3 1 2000 11 93.9

姓名:zhang3

性別:男

出生日期:2023年1月1日

英語成績:93.9

請輸入張三的資訊

zhang3 3 200020 -3 93.9

姓名:zhang3

性別:男

出生日期:2023年1月1日

英語成績:93.9

對於student類,有6個私有成員變數,雖然程式中用student類定義乙個物件實際上還是相當於定義了6個普通的變數,但與c語言中的結構型變數不同,這些普通的變數不能在類之外的程式中直接訪問。student類還有2個公有的成員函式,它們的內部名為setdata和showmessage,但程式中它們的名字為物件.內部名,與成員變數的名字類似。類中的私有成員變數只有在類的成員函式中使用,也就是說只能通過公有的成員函式setdata為物件的成員變數賦值,如果setdata中有驗證資料合法性的**,則在程式中不可能把物件的成員變數賦值為非法的資料。

思考:類是怎樣保證其物件的成員變數不被非法的資料賦值的?

1)student中的setdata函式只是簡單地驗證了日期的合法性。

2)c++相容c語言,但c++中的結構型與類幾乎相同,也可以有成員函式。

邏輯的封閉性

始終認為,的好壞,在於思維邏輯的有效性 完整性 封閉性 只有這樣才可能盡量的保證少出現bug,或者在需求變更的時候,出現改了一處又出現一處的問題 同樣,在解決問題的時候,也應該使用同樣的思路去檢驗問題。否則,極易出現漏掉的情況。特別是因為重構 重用等,將邏輯拆的相對凌亂的時候 保證這一點前提,可能最...

併發類容器 第二講

跳表的由來 作用 儲存有序序列,並且實現高效的查詢與插入刪除。儲存有序序列最簡單的辦法就是使用陣列,從而查詢可以採用二分搜尋,但插入刪除需要移動元素較為低效。因此出現了二叉搜尋樹,用來解決插入刪除移動元素的問題。但二叉搜尋樹在最壞情況下會退化成一條單鏈表,搜尋的效率降為o n 為了避免二叉搜尋樹的退...

第二講小結(類與物件初)

列一下自己不熟的內容 注意設定私有成員的意義 是為了強制之後訪問成員變數時一定通過成員函式進行。目的是方便修改。建構函式 居家必備 建構函式的意義就是防止你忘了初始化。要是public的。複製建構函式 要點就在於引數是對同類物件的引用。複製建構函式有三種情況會起作用 1.用乙個物件去初始化同類的另乙...