第2周專案-課後實踐·閱讀程式(2)
/*
* 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 概括這種寫法的特點:
將公共成員放在前面,私有成員放在後面,同時將成員寫在類定義之外。
l 在類定義中,公共成員在前,私有成員在後,有何好處?
私有成員是我們無法訪問的,對我們來說不需要去關注它們是怎麼樣去實現的。一個設計良好的類,會把公共成員(包括公共方法和公共成員變數)寫在前面,方便類的使用者開啟此類的定義檔案就能看到,而不用往後面翻,而把私有成員放到靠後的位置。
l 成員函式的實現寫在類定義之外,有何好處?
使一個類更簡潔明瞭,方便查詢問題,更能體現結構框架。
l 將第5行public:去掉,記錄出現的問題;原因是。(結束後加上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_data和display變為了私有的成員函式,無法再被類外呼叫。
l 將第18行void 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是類名,::是作用域限定符(作用域運算子)用它宣告函式是屬於那個類的。
l 在第30行後加一句:stud1.num=3,記錄出現的情況,並解釋原因。
出現的情況:
cpp:10:9: error: 'int Student::num' is private
cpp:31:11: error: within this context
原因:
num是此類中的私有的資料成員,不能在類外被引用。
l 去掉剛加的那一行,將第31行stud1.display();中的stud1.去掉,記錄出現的情況,並解釋原因。
出現的情況:
cpp:31:13: error: 'display' was not declared in this scope
原因:
display()是類Student中的成員函式,而不是類外直接定義的函式,使用它時需要指定物件。
l 在第32行後增加cout<<sizeof(stud1),看輸出的結果,請做出解釋。
結果在原有的輸出上增加了輸出了28。
解釋:
將stud1的屬性--num,name,sex所佔的位元組長度輸出出來了。
l 初學者常將類定義後的分號丟掉,試將13行最後的分號去掉,記錄出現的提示,並做出解釋。
提示:cpp:13:1: error: expected ';' after class definition
解釋:
類的定義本身就是語句,所以需要加分號。
(3)在閱讀這兩個程式的基礎上再次深入體會下面的基本概念
宣告一個類,可以定義出結構相同的一組物件——類是物件的抽象,物件是類的例項;
類/物件中包括資料成員和成員函式兩部分——類/物件實現了對程式設計中要描述的實體的封裝處理:將有關的資料和操作程式碼封裝在一個物件中,形成一個基本單位,各個物件(如程式中stud1和stud2)之間相對獨立,互不干擾。
資訊隱蔽(imformation hiding)——將物件中某些部分(通過private限定符)對外隱蔽,即隱蔽其內部細節,只留下少量介面,以便與外界聯絡,接收外界的訊息。
封裝和資訊隱蔽的優點:把物件的一部分屬性和功能對外界遮蔽,從外界是看不到的,甚至是不可知的,有利於資料安全,防止無關的人瞭解和修改資料。同時,大大降低了操作物件的複雜程度。
相關文章
- 第2周專案-課後實踐·閱讀程式(1)
- 第4周課後實踐·閱讀程式-建構函式和解構函式(2)函式
- 第3周課後實踐·閱讀程式(2)-利用指標訪問私有資料成員指標
- 第4周課後實踐·閱讀程式-建構函式和解構函式(3)函式
- 第4周課後實踐·閱讀程式-建構函式和解構函式(4)函式
- 第4周課後實踐·閱讀程式-建構函式與解構函式(1)函式
- 第3周課後實踐·程式閱讀(4)-利用引用訪問私有資料成員
- 第3周課後實踐·閱讀程式(3)-利用函式訪問私有資料成員函式
- 主題閱讀-專案實踐感悟
- 實踐JavaWeb課程專案JavaWeb
- Web最佳實踐閱讀總結(2)Web
- 第13周-閱讀專案2-有關引數的get函式函式
- 第15周-閱讀專案2-異常處理&&名稱空間
- 第14周-閱讀專案5-字串流物件字串物件
- 《GitHub 入門與實踐》閱讀筆記(第4章)Github筆記
- 知乎專案程式碼閱後總結
- 《軟體工程》第2次作業(1、個人專案實踐)軟體工程
- 青雲 QingCloud 實踐課堂(第 2 季深圳站)GCCloud
- 第14周-閱讀專案1-二進位制檔案的讀寫
- 一本實踐的專案開發《Python專案開發實戰(第2版)》Python
- 第13周-閱讀專案4-寫出下面程式的輸出結果
- 第13周-閱讀專案3-對文字檔案的訪問
- 第 36 期 k8s context 實踐原始碼閱讀K8SContext原始碼
- 教你閱讀 Python 開源專案程式碼Python
- 第14周-閱讀專案2-中文字元以二進位制方式儲存字元
- 開源早讀課週刊:第2期
- 專案管理基礎與實踐(2)專案管理
- 專案管理知識體系指南(PMBOOK指南)(第5版) 閱讀摘要專案管理
- 第 27 期 go mod 原始碼閱讀 part 2Go原始碼
- 前後端分離專案實踐分析後端
- Web最佳實踐閱讀總結(1)Web
- 配置Source Insight閱讀PHP專案的程式碼PHP
- 第15周-閱讀專案1-異常處理&&名稱空間
- 專案實踐-進度遊戲(2):90% Done遊戲
- 程式碼大全2閱讀筆記筆記
- 結合軟體工程課 談談最近閱讀的所想所得 -- 個人閱讀作業2軟體工程
- 第13周-閱讀專案1-標準輸入輸出物件及文字檔案物件
- git幫助閱讀開源專案Git