「c 技術」第7章 面向對象的程序設計

2021-01-09 陽仔聊技術

本章要點:

面向對象的基本概念

類的定義與對象的聲明

構造函數和析構函數

類的靜態成員和實例成員

方法重載及運算符重載的編程實現

類的繼承與多態性的編程實現

類的屬性的實現

7.1 循序漸進學理論

7.1.1 面向對象程序設計概述

1.面向對象程序設計的由來

面向對象的程序設計是一種基於結構分析的、以數據為中心的程序設計方法。面向對象的程序設計方法總體思路是:將數據及處理這些數據的操作都封裝(Encapsulation)到一個稱為類(Class)的數據結構中,在程序中使用的是類的實例——對象。對象是代碼與數據的集合,是封裝好了的一個整體,對象具有一定的功能。也就是說對象是具有一定功能的程序實體。程序是由一個個對象構成的,對象之間通過一定的「相互操作」傳遞消息,在消息的作用下,完成特定的功能。

2.面向對象程序設計的基本概念

(1)類和對象

通常把具有同樣性質和功能的東西所構成的集合叫作類。

(2)屬性、方法與事件

屬性是對象的狀態和特點。

方法是對象能夠執行的一些操作,它體現了對象的功能。

事件是對象能夠識別和響應的某些操作。

(3)封裝

所謂的封裝,就是將用來描述客觀事物的一組數據和操作組裝在一起,形成一個類。

(4)繼承

類之間除了有相互交流或訪問的關係以外,還可能存在著一種特殊的關係,這就是繼承。在VisualC#中只支持單繼承,即一個派生類只能有一個基類。

(5)重載

重載指的是方法名稱一樣,但如果參數不同,就會有不同的具體實現。重載主要有兩類:方法重載及運算符重載。

(6)多態性

所謂多態性就是在程序運行時,面向對象的語言會自動判斷對象的派生類型,並調用相應的方法。

7.1.2 類和對象的聲明

1.類的聲明

[格式]:[類修飾符]class 類名[:基類類名]

{

成員定義列表;

}

【例7-1】定義一個Student類,用來對學生的信息和功能進行描述。假設學生具有學號、姓名、年齡、性別、平均成績等特徵,並且具有設置學生特徵和顯示學生特徵的功能。

2.對象的聲明

[格式]:類名 實例名=new類名([參數]);3.類的成員

(1)類成員的分類

類的具體成員如下。

常量:用來定義與類相關的常量值。

欄位:類中的變量,相當於C++中的成員變量。

類型:用來定義只能在類中使用的局部類型。

方法:完成類中各種計算或功能的操作。

屬性:定義類的特徵,並對它們提供讀、寫操作。

事件:由類產生的通知,用於說明發生了什麼事情。

索引器:允許編程人員在訪問數組時,通過索引器訪問類的多個實例。又稱下標指示器。

運算符:定義類的實例能使用的運算符。

構造函數:在類被實例化時首先執行的函數,主要是完成對象初始化操作。

析構函數:在對象被銷毀之前最後執行的函數,主要是完成對象結束時的收尾操作。

(2)類成員的可訪問性

在編寫程序時,可以對類的成員使用不同的訪問修飾符,從而定義它們的訪問級別,即類成員的可訪問性(Accessibility)。

在C#中,根據類成員的可訪問性可以把類成員分成四類,分別是公有成員(public)、私有成員(private)、保護成員(protected)、內部成員(internal)。

(3)類的靜態成員和實例成員

類的成員又可以分成靜態成員和非靜態成員。在聲明成員時,如果在語句前加上static保留字,則該成員是靜態成員,如果沒有static保留字,則成員是非靜態成員。二者最重要的區別是:靜態成員屬於類所有,非靜態成員屬於類的實例所有,所以又稱實例成員。

7.1.3 類的構造函數和析構函數

1.構造函數

構造函數主要用來為對象分配存儲空間,完成初始化操作(如給類的成員變量賦值等)。在C#中,類的構造函數遵循以下規定。

(1)構造函數的函數名和類的名稱一樣。

(2)當某個類沒有構造函數時,系統將自動為其創建構造函數,這種構造函數稱為默認構造函數。如例7-2中默認的構造函數為:

Example1()

{

};

(3)構造函數的訪問修飾符總是public。如果是private,則表示這個類不能被實例化,這通常用於只含有靜態成員的類中。

(4)構造函數由於不需要顯式調用,因而不用聲明返回類型。

(5)構造函數可以帶參數也可以不帶參數。

2.析構函數

析構函數在對象銷毀時被調用,常用來釋放對象佔用的存儲空間。析構函數具有以下特點。

(1)析構函數不能帶有參數。

(2)析構函數不能擁有訪問修飾符。

(3)不能顯式地調用析構函數。

(4)析構函數的命名規則是在類名前加上一個「~」號。如上例的Example1類的析構函數為:

~Example1()

{

};

(5)析構函數在對象銷毀時自動調用。

【例7-3】 類的構造函數和析構函數的演示。(程序代碼詳見例7-3)[執行結果]

7.1.4 類的方法及方法的重載

1.方法的定義

[格式]:[方法修飾符] 返回值類型 方法名([參數列表])

{ 方法實現部分;

}

2.靜態方法和非靜態方法

對於靜態方法和非靜態方法,只需抓住以下幾點:(1)靜態方法屬於類所有,非靜態方法屬於類定義的對象所有;(2)非靜態方法可以訪問類中包括靜態成員在內的所有成員,而靜態方法只能訪問類中的靜態成員。

【例7-4】 靜態方法和動態方法的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-4)

[執行結果]

3.參數數組

關於參數數組,需掌握以下幾點。

(1)若形參表中含一個參數數組,則該參數數組必須位於形參列表的最後;

(2)參數數組必須是一維數組;

(3)不允許將params修飾符與ref和out修飾符組合起來使用;

(4)與參數數組對應的實參可以是同一類型的數組名,也可以是任意多個與該數組的元素屬於同一類型的變量;

(5)若實參是數組則按引用傳遞,若實參是變量或表達式則按值傳遞。

【例7-5】 參數數組的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-5)

[執行結果]

4.方法的重載

方法重載是指同樣的一個方法名,有多種不同的實現方法。方法重載的格式是在一個類中兩次或多次定義同名的方法,這些同名的方法包括從基類繼承而來的方法,這些方法名稱相同,但每個方法的參數類型或個數不同,從而便於在用戶調用方法時系統能夠自動識別應調用的方法。

【例7-6】 方法重載的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-6)

[執行結果]

7.1.5 運算符重載

在C#中,運算符重載在類中進行聲明,聲明的格式如下。

[格式]:返回值類型 operator 運算符(運算對象列表)

{

重載的實現部分;

};

在C#中,可以重載的運算符主要有:

+ - ! ~ ++ -- true false

* / % & | ^ << >> == != < > <= >=

不能重載的運算符有: .

= && || ?: new typeof sizeof is

【例7-7】 運算符重載的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-7)

[執行結果]

7.1.6 域與屬性

1.域

域又稱欄位,它是類的一個成員,這個成員代表與對象或類相關的變量。域的定義格式如下。

[格式]:[域修飾符] 域類型 域名;

【例7-8】 域的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-8)

[執行結果]

2.屬性

屬性是對現實世界中實體特徵的抽象,它提供了一種對類或對象特性進行訪問的機制。屬性的聲明格式如下。

[格式]:[屬性修飾符] 類型說明符 屬性名 {訪問聲明}【例7-9】 屬性的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-9)

[執行結果]

7.1.7 this關鍵字

this關鍵字用來引用類的當前實例,成員通過this關鍵字可以知道自己屬於哪一個實例。this關鍵字只能用在類的構造函數、類的實例方法中,在其它地方(如靜態方法中)使用this關鍵字均是錯誤的。

7.1.8 類的繼承

繼承是面向對象程序設計中實現代碼重用的重要機制之一,它起源於現實世界中事物之間的聯繫。

類的繼承的基本格式與功能如下。

[格式]:

class 派生類類名:基類類名

{ 成員聲明列表;

}

【例7-10】 類繼承的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-10)

[執行結果]

7.1.9 多態性

多態性是指同一操作作用於不同類的實例,這些類對它進行不同的解釋,從而產生不同的執行結果的現象。在C#中有兩種多態性:編譯時的多態性和運行時的多態性。

運行時的多態性是通過繼承和虛成員來實現的。運行時的多態性是指系統在編譯時不確定選用哪個重載方法,而是直到程序運行時,才根據實際情況決定採用哪個重載方法。

編譯時的多態性具有運行速度快的特點,而運行時的多態性則具有極大的靈活性。

【例7-11】 虛函數與多態性的演示。請觀察並分析下列程序的執行結果。(程序代碼詳見例7-11)

[執行結果]

7.1.10 密封類與抽象類

把一個類聲明為密封類的原因是為了防止該類被其它類繼承,密封類的聲明方法是在類名前加上sealed修飾符。

抽象類表示一種抽象的概念,一般用於為派生類提供公共接口。在聲明類時,在類名前有abstract修飾符則表示該類為抽象類。抽象類只能作為其他類的基類,不能被實例化,在抽象類中可以包含抽象方法和抽象訪問器。

7.2 典型實例練能力

7.2.1 典型實例一:Time類的創建與演示【實例題目】

編寫一個名為Time1的類,該類能夠存放時間信息,並且具有設置時間和顯示時間的功能。然後編程對該類進行測試。測試界面如圖7-1所示。

7.2.2 典型實例二:複數「*」運算及複數值設置的實現

【實例題目】

編寫一個複數類,該複數類具有以下功能:(1)乘法運算的功能。如a和b分別是該複數類的兩個實例,則可以進行a*b的運算,運算結果是一個複數,該複數是複數a和複數b的乘積。(2)對複數值進行設置的功能,有兩種設置方法,分別對複數的實部(虛部為0)進行設置、對複數的實部和虛部同時進行設置。然後編程進行驗證。驗證界面如圖7-2所示。

7.3 上機練習重應用

7.3.1 上機練習一:棧模型的實現

【練習題目】

棧是一種重要的數據結構,在內存中佔用連續的存儲單元。棧有兩個端點,固定的棧底和浮動的棧頂。為指示棧頂位置還應設一個指示成員變量(稱為棧頂指示器)。棧有兩種基本操作:push(壓棧)和pop(出棧),壓棧是向棧頂位置寫入一個元素,然後使棧頂指示器加1,出棧是先使棧頂指示器減1,再把該位置的元素讀出來。棧及其操作模型如圖7-3所示,sp代表棧頂指示器。請編程實現棧的模型並對之進行測試,測試的界面如圖7-4所示。

7.3.2 上機練習二:從shape類派生出Rectangle、Circle等具體形狀類

【練習題目】

定義一個shape抽象類,利用它作為基類派生出Rectangle、Circle等具體形狀類,已知具體形狀類均具有兩個方法GetArea和GetPerim,分別用來求形狀的面積和周長。最後編寫一個測試程序對產生的類的功能進行驗證,驗證程序的運行界面如圖7-5所示。

相關焦點

  • 科普文,面向對象程序設計,要知道的那點事
    面向對象程序設計更簡單,編程者需要關心的事情,就那點事。一、什麼是對象?在現實生活中,每一個具體事物,都是對象!在程序設計中,每一個可以操作的實體,就是對象。是具有屬性和方法的實體。舉個例子吧!表單、標籤、命令按鈕都是對象。二、什麼是對象的屬性和屬性值?在現實生活中,每個對象都有自己的特性,我們可以具現化成一個具體的值。某喵,體重2斤,梨花毛,出生日期2020年8月4日。在面向對象程序設計中,對象的特性稱為對象的屬性。對象特性的具體值,被稱為屬性值。比如,程式設計師可以給不同的命令按鈕,賦予不同的屬性值。
  • Objeck v5.6.1 發布,面向對象程序設計語言
    Objeck 是一種受 Java 啟發,同時受 Scheme 和 UML 影響的面向對象程序設計語言。Objeck 特性為快速,易於使用,輕巧且跨平臺。Objeck 把所有的數據類型都當成是對象,包含一個編譯器和虛擬機,具有內存管理和 JIT 編譯器。
  • 面向對象編程會被拋棄嗎?這五大問題不容忽視
    儘管這個想法很巧妙,但直到 1981 年,面向對象編程才成為主流。在那之後,它就沒有停止過吸引新的和經驗豐富的軟體開發者。面向對象的程式設計師市場一如既往地忙碌。但是在最近幾年中,這種已有幾十年歷史的編程範式受到越來越多的批評。難道是在面向對象編程大行其道 40 年之後,技術已經超越了這種範式?
  • 如何給女朋友解釋什麼是面向對象編程?
    女朋友拿著一本《面向對象編程》過來找我。什麼是面向對象?是要面向我寫代碼嗎?不是啦,這個面向對象的對象不是你這個對象啦。此時,我突然感受到了一股莫名的殺氣。什麼?你還有其他對象嗎?有我好看嗎?有我瘦嗎?不對。你不能有其他對象。什麼是面向對象?面向對象,英文名字叫Object Oriented,是一種軟體開發方法。
  • 聊聊面向對象編程的幾個基本原則
    進行面向對象編程,有下面幾個原則:一. 面向抽象原則二. 開閉原則三. 多用組合少用繼承原則四. 高內聚-低耦合原則下面首先先介紹抽象類和接口,然後介紹面向抽象編程。1.2 接口如果你也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,7個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高性能及分布式、高性能、深入淺出。高架構。
  • 面向全球高校大學生 2020虎牙小程序技術挑戰賽正式上線
    面向全球高校大學生 2020虎牙小程序技術挑戰賽正式上線 5 月 22 日, 2020 虎牙小程序技術挑戰賽正式官宣上線,並向全球高校在校生開啟報名通道。
  • Python面向對象編程的基本概念
    九道門商業數據分析學院提供介紹在學習面向對象的編程時。我決定深入了解它的歷史,結果令人著迷。術語「面向對象程序設計」(OOP)是艾倫·凱(Alan Kay)在1966年讀研究生時提出的。名為Simula的語言是第一種具有面向對象編程功能的程式語言。它是在1967年開發的,用於製作仿真程序,其中最重要的信息稱為對象。
  • 如何以面向對象的思想設計有限狀態機
    那要怎樣設計代碼量少,又不需要以遍歷狀態轉移表的形式從而花費大量時間的狀態機呢?這個時候就需要以面向對象的思想來設計有限狀態機。面向對象法設計狀態機面向對象基本概念以面向對象的思想實現的狀態機,大量涉及了對於函數指針的用法,必須對這個概念比較熟悉上述所提到了兩個設計方法都是基於面向過程的一種設計思想,面向過程編程(POP)是一種以過程為中心的編程思想,以正在發生的事件為主要目標,指導開發者利用算法作為基本構建塊構建複雜系統。
  • 編程大佬總結的50點學習C+的方法,一針見血,少走彎路
    14.浮躁的人容易問:xx和yy哪個好;——告訴你吧,都好——只要你學就行; 15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人; 16.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡; 17.c++不僅僅是支持面向對象的程序設計語言;
  • 面向對象編程的興衰
    面向對象編程(OOP)並沒有消亡。但與過去相比,它確實沒有那麼普及了。在 90 年代時,有很多面向對象編程相關的教科書和計算機科學課程。它就是「流行趨勢」。然而,隨著時間的流逝,人們開始意識到,嚴格的面向對象方法會帶來很多問題。這些問題往往會使代碼更複雜、更難以理解且更難以測試。
  • 雲計算開發學習筆記:Python3 面向對象技術簡介
    來源:TechWeb.com.cnPython從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對象是很容易的。本章節我們將詳細介紹Python的面向對象編程。如果你以前沒有接觸過面向對象的程式語言,那你可能需要先了解一些面向對象語言的一些基本特徵,在頭腦裡頭形成一個基本的面向對象的概念,這樣有助於你更容易的學習Python的面向對象編程。接下來我們先來簡單的了解下面向對象的一些基本特徵。面向對象技術簡介① 類(Class): 用來描述具有相同的屬性和方法的對象的集合。
  • NEEDS Lab講座報名 | 「你好,設計!」第二季第4講
    NEEDS Lab「你好,設計!」  第二季第4講報名  這一次的「你好,設計!」演講場館——中洲未來實驗室C Future Lab,正在展出一場佔地2000平方米的展覽,以「賦能現代城市的規劃與運營,創造更具幸福感與可持續性的都市人居環境」的理念,6個國家、16支頂級設計師團隊傾力打造。
  • 什麼是面向對象,有什麼特點
    在程式語言中,面向對象的使用是非常重要的,在PHP語言中也是用了很多年才獲得這項技術。面向對象的出現是系統開發中一個偉大的改革,程式語言開始從應用程式回到數據上。面向對象將編程過程中焦點轉向建模的真是實體上,讓應用程式更加接近現實世界。下面小編為大家主要介紹面向對象。
  • 什麼是面向過程和面向對象編程
    一張圖帶你看懂什麼是面向過程和面向對象編程兩種思想的對比:面向過程是具體的東西,而且面向過程是面向對象的基礎。比如開汽車去某個地方,你就需要先有個汽車而且你需要會開車,而汽車有開車,加減速和剎車等功能,關於汽車的操作每一個都需要一個具體的過程來實現總結來說就是,面向過程是一種基礎的方法,它考慮的是實際的實現。一般情況下,面向過程是自頂向下逐步求精,其最重要的是模塊化的思想方法。因此在模塊化編程的時候才會有「低耦合,高內聚」的思想來提高效率。
  • 一個號稱人工智慧看面相的小程序「面相研究院」在小程序圈爆紅
    打開APP 一個號稱人工智慧看面相的小程序「面相研究院」在小程序圈爆紅 發表於 2018-12-04 13:50:49 01 人工智慧面相分析 掌握了人們這個心理,近日,一個號稱人工智慧看面相的小程序「面相研究院」在小程序圈爆紅。
  • 「面相研究院」爆火!AI看相靠譜嗎?
    我們為分銷渠道專門開發了「代理助手」小程序,佣金實時查看,在線體現佣金,綁定推廣小號、綁定公共帳號推廣、綁定群推廣小號等功能。不過事實上,通過該頁面申請資格的效率並不高,更多的還是靠朋友圈羊毛黨的口口相傳:告訴他們你的手機號,他們在「代理助手」中增加你為代理後,直接使用手機號登錄「代理助手」小程序,即可成為該團隊中的代理。
  • 《未定事件簿》第3章心之天平怎麼過 第3章心之天平通關攻略
    未定事件簿手遊第3章心之天平通關攻略 證據搜索 3-9 需要觀察藥... 在未定事件簿手遊中每個人的心裡都有一個天平,而第三章的通關方式還有不少玩家並不是很清楚呢!還沒過關的話,下面就來看一下吧~!
  • 民法典·天天聽(第3編第20章第4節)|「技術諮詢合同和技術服務合同...
    第三編 合同第二分編 典型合同第二十章 技術合同第四節 技術諮詢合同和技術服務合同第八百七十八條技術諮詢合同是當事人一方以技術知識為對方就特定技術項目提供可行性論證、技術預測、專題技術調查、分析評價報告等所訂立的合同。
  • 2016年10月成人自考計算機基礎與程序設計真題
    D.具有破壞性的程序7.環境D.方法18.具有隻有上一階段工作完成後才能進入到下一階段工作的軟體生命周期模型是( )A.瀑布模型B.增量模型C.螺旋模型D.噴泉模型19.下列工具中為需求分析常用工具的是( )A.PADB.DFPC.N-SD.PFD20.在面向對象方法中
  • 淺談《華嚴金師子章》的「十玄無礙」和「六相圓融」思想(上)
    一、緒言《華嚴金師子章》是唐代法藏法師為武則天宣講華嚴義理的記錄整理稿。法師借鎮殿金師子為喻,闡明華嚴思想的基本綱要。本篇試根據章中重點「六相」和「十玄」,說明華嚴宗事事無礙法界的思想。《華嚴金師子章》全文共分十段,一如喜好用「十」數來論述佛教教義和各種問題的華嚴宗哲學特點,亦包含了法師讚嘆其派別教義圓滿無盡的用意。