第2周專案-課後實踐·閱讀程式(2)

不被看好的青春叫成長發表於2015-03-12
/*  
 * Copyright (c) 2015, 煙臺大學計算機學院  
 * All rights reserved.  
 * 檔名稱:test.cpp  
 * 作    者:劉暢   
 * 完成日期:2015年 3 月 12 日  
 * 版 本 號:v1.0  
 *  
 * 問題描述:閱讀第二個物件導向的程式--同樣功能的程式提倡以下面的形式書寫(這是專業人士更願意使用的方式),閱讀程式,回答相關問題;
 * 輸入描述: NULL;
 * 程式輸出: NULL。


程式碼如下:

#include <iostream>
#include <cstring>
using namespace std;
class Student
{
public:
    void set_data(int n, char *p,char s);
    void display( );
private:
    int num;
    char name[20];
    char sex;
};
void Student::set_data(int n, char *p,char s)
{
    num=n;
    strcpy(name,p);
    sex=s;
}
void Student::display( )
{
    cout<<"num: "<<num<<endl;
    cout<<"name: " <<name<<endl;
    cout<<"sex: " <<sex<<endl;
}
int main()
{
    Student stud1,stud2;
    stud1.set_data(1,"He",'f');
    stud2.set_data(2,"She",'m');
    stud1.display();
    stud2.display();
    cout<<sizeof(stud1);
    return 0;
}


問題如下:

l 概括這種寫法的特點:

將公共成員放在前面,私有成員放在後面,同時將成員寫在類定義之外。

在類定義中,公共成員在前,私有成員在後,有何好處?

私有成員是我們無法訪問的,對我們來說不需要去關注它們是怎麼樣去實現的。一個設計良好的類,會把公共成員(包括公共方法和公共成員變數)寫在前面,方便類的使用者開啟此類的定義檔案就能看到,而不用往後面翻,而把私有成員放到靠後的位置。

成員函式的實現寫在類定義之外,有何好處?

使一個類更簡潔明瞭,方便查詢問題,更能體現結構框架

將第5public:去掉,記錄出現的問題;原因是。(結束後加上public,將程式改回正確狀態。)

問題如下:

cpp:14:6: error: 'void Student::set_data(int, char*, char)' is private

cpp:29:30: error: within this context

:29:30: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

cpp:14:6: error: 'void Student::set_data(int, char*, char)' is private

cpp:30:31: error: within this context

cpp:30:31: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

cpp:20:6: error: 'void Student::display()' is private

cpp:31:19: error: within this context

cpp:20:6: error: 'void Student::display()' is private

cpp:32:19: error: within this context

原因是:

去掉public後,公開的成員函式set_datadisplay變為了私有的成員函式,無法再被類外呼叫。

將第18void Student::display( )寫作為void display(),即去掉Student::,結果會是?,Student::的作用是?(將程式改回正確狀態。)

結果是:

cpp: In function 'void display()':

cpp:22:20: error: 'num' was not declared in this scope

cpp:23:22: error: 'name' was not declared in this scope

cpp:24:21: error: 'sex' was not declared in this scope

Student::中,Student是類名,::是作用域限定符(作用域運算子)用它宣告函式是屬於那個類的。

在第30行後加一句:stud1.num=3,記錄出現的情況,並解釋原因。

出現的情況:

cpp:10:9: error: 'int Student::num' is private

cpp:31:11: error: within this context

原因:

num是此類中的私有的資料成員,不能在類外被引用。

去掉剛加的那一行,將第31stud1.display();中的stud1.去掉,記錄出現的情況,並解釋原因。

出現的情況:

cpp:31:13: error: 'display' was not declared in this scope

原因:

display()是類Student中的成員函式,而不是類外直接定義的函式,使用它時需要指定物件。

在第32行後增加cout<<sizeof(stud1),看輸出的結果,請做出解釋。

結果在原有的輸出上增加了輸出了28

解釋:

stud1的屬性--numnamesex所佔的位元組長度輸出出來了。

初學者常將類定義後的分號丟掉,試將13行最後的分號去掉,記錄出現的提示,並做出解釋。

提示:cpp:13:1: error: expected ';' after class definition

解釋:

類的定義本身就是語句,所以需要加分號。

 

 

(3)在閱讀這兩個程式的基礎上再次深入體會下面的基本概念

宣告一個類,可以定義出結構相同的一組物件——類是物件的抽象,物件是類的例項

類/物件中包括資料成員和成員函式兩部分——類/物件實現了對程式設計中要描述的實體的封裝處理:將有關的資料和操作程式碼封裝在一個物件中,形成一個基本單位,各個物件(如程式中stud1和stud2)之間相對獨立,互不干擾。

資訊隱蔽(imformation hiding)——將物件中某些部分(通過private限定符)對外隱蔽,即隱蔽其內部細節,只留下少量介面,以便與外界聯絡,接收外界的訊息。

封裝和資訊隱蔽的優點:把物件的一部分屬性和功能對外界遮蔽,從外界是看不到的,甚至是不可知的,有利於資料安全,防止無關的人瞭解和修改資料。同時,大大降低了操作物件的複雜程度。


 

 

 

相關文章