C++之類和對象的特性

来源:http://www.cnblogs.com/iloverain/archive/2016/07/01/5633544.html
-Advertisement-
Play Games

C++並不是一個純粹的面向對象的語言,而是一種基於過程和麵向對象的混合型的語言。 凡是以類對象為基本構成單位的程式稱為基於對象的程式,再加上抽象、封裝、繼承和多態就成為面向對象程式。 ...


  簡介:C++並不是一個純粹的面向對象的語言,而是一種基於過程和麵向對象的混合型的語言。

凡是以類對象為基本構成單位的程式稱為基於對象的程式,再加上抽象、封裝、繼承和多態就成為面向對象程式。

1.掌握類的概念、類的定義格式、類與結構的關係、類的成員屬性和類的封裝性;

2.掌握類對象的定義;

3.理解類的成員的訪問控制的含義,公有、私有和保護成員的區別。

4.能夠根據給定的要求定義類並實現類的成員函數;

  何為對象?

對象兩要素:屬性和行為;

屬性對應於對象的數據;行為對應於函數;

對象之間可以通過一定的渠道相互聯繫;要使某一個對象實現某一種行為(操作),應當向它傳送相應的消息

  封裝與信息隱蔽 

可以對一個對象進行封裝處理,把它的一部分屬性和功能對外屏蔽,外界看不到,甚至不可知;這就是封裝。

所謂封裝有兩方面的含義:一是將有關數據和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相互獨立,互不幹擾;二是將對象中的某些部分對外隱蔽,即陰部內部細節,保留少量介面,以便與外界聯繫,接受外界信息。信息隱蔽有利於數據安全,防止無關的人瞭解和修改。

  抽象:表示同一類事物的本質;類是對象的抽象,對象是類的特例,即類的具體表現形式;

  繼承和軟體重用

  多態

如果有幾個相似而不完全相同的對象,有時要求在向它們發出同一個消息時,它們的反應各不相同,分別執行不同的操作,這種現象就是多態;

由繼承而產生的不同的派生類,其對象對同一消息會作出不同的響應。增加程式的靈活性;

  面向對象程式的特點

區別於基於過程程式設計是圍繞功能進行的,用一個函數實現一個功能。而面向對象程式設計面對的是一個個對象。把數據和有關操作封裝成一個對象。

程式設計者的任務包括兩個方面:

一是對所需的各種類和對象進行設計,即決定把哪些數據和操作封裝在一起;

二是考慮怎樣向有關對象發送消息,以完成所需的任務;

結構化程式設計:程式=演算法+數據結構

面向對象程式設計:程式=對象s+消息 (對象=演算法+數據結構)

  類的聲明和對象的定義

類是抽象的,不占用記憶體;而對象是具體的,占用記憶體空間;

類的聲明參考 結構體的聲明;C語言結構體的定義和使用

類的成員訪問限定符:private/public/protected

private只能被本類中的成員函數引用,類外不能調用(友元類除外);預設為私有的;

public既可以被本類中的成員函數引用,也可被類的作用域內的其他函數引用,外界可調用;

protected它不能被類外訪問,但可以被派生類的成員函數訪問;

一般先寫public部分,再寫private私有部分;

  類的定義方法

1/2/3

  類和結構體的異同

由於C++是在C的基礎上發展的,因此C++保留了C的特性;由於C++類具有C中結構體的特性;因此結構體和類均可以聲明類;

區別是:用struct聲明的類,系統預設其數據成員public

  類的成員函數

可以是private/public

  在類外定義成員函數

在類體中聲明成員函數,在類外進行定義。

class student
{
public:
     void display();   // 函數聲明
private:
      int num;
      char sex;        
};
       void Student::display( ) //函數體
{
       cout<<"num:"<<num<<endl;
}

::作用域限定符,聲明函數是屬於哪個類的。

類函數必須先在類體中作原型聲明,然後在類外定義;

如果一個函數體只要兩三行,一般可在類體中定義;

多於三行的函數,一般在類體內聲明,在類外定義;

  內置成員函數 inline

在類體中定義的成員函數一般較小,而系統調用函數的過程所花費的時間開銷相對是比較大的。

調用一個函數的時間開銷遠遠大於小規模函數體中全部語句的執行時間;

為了減小時間開銷,如果在類體中定義的成員函數不包括迴圈等結構,C++系統自動地對它們作為內置函數來處理;

在程式調用這些函數時,並不是真正的執行函數的調用過程,而是把函數代碼嵌入程式的調用點。

對於類內定義的成員函數,可以省略inline;

對於在類外定義的成員函數,系統並不把它預設為內置函數;需要在聲明時用inline作顯式聲明;二者其一均可(聲明/定義時候);

如果在類體外定義inline函數,則必須將類定義和成員函數的定義都放在同一個頭文件中(寫在同一個源文件中),否則編譯時無法進行置換。

只有在類外定義的成員函數規模很小且調用頻率較高時,才指定位內置函數;

  成員函數的存儲方式

同一類的不同對象中的數據成員的值一般是不相同的,而不同對象的函數的代碼是相同的,不論調用哪一個對象的函數的代碼,其實調用的都是同樣內容的代碼;

C++類中的每個對象所占用的存儲空間只是該對象的數據成員所占用的存儲空間,而不包括函數代碼所占用的存儲空間;只取決於對象中數據成員所占用的空間,與成員函數無關;

不同對象使用同一個函數代碼段,它怎麼能分別對不同對象中的數據進行的操作呢? this指針,當調用哪個對象中的函數,this指針就指向哪個對象;

註意:1)不論成員函數在類內定義還是在類外定義,成員函數的代碼段的存儲方式是相同的,都不占用對象的存儲空間;

2)不要將成員函數的這種存儲方式和inline函數的概念混淆;inline隻影響程式的執行效率,與存儲方式無關;

3)從邏輯角度看成員函數,從物理角度看成員函數的存儲方式;

  對象成員的引用

通過對象名和成員名運算符訪問對象中的成員;在類外只能訪問public成員;

通過指針

通過引用

  類的封裝和信息隱蔽性

公用介面和私有實現的分離

在聲明類時,一般都是把所有的數據指定位私有的,使它們與外界隔離,把需要讓外界調用的成員函數指定位公開的,在類外雖然不能直接訪問私有數據成員,但可以通過調用公用成員函數來引用甚至修改私有數據;

class student
{

private:
      int num;
      char sex;        
      string name;  // 此行時新增的
      public:
 void Student::display( ) //函數體
{
       cout<<"num:"<<num<<endl;
       cout<<"name:"<<name<<endl;  //此行新增的
}
};

當介面與實現(對數據的操作)分離時,只要類的介面沒有改變,對私有實現的修改不會引起程式的其他部分的修改;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是個對於讀寫鎖中級剖析文章, 會自己實現讀寫鎖的細節.歡迎用到自己的項目中. ...
  • 在 HttpRequest 對象中,屬性 GET 和 POST 得到的都是 django.http.QueryDict 所創建的實例。這是一個 django 自定義的類似字典的類,用來處理同一個鍵帶多個值的情況。 在 python 原始的字典中,當一個鍵出現多個值的時候會發生衝突,只保留最後一個值。 ...
  • 一、過濾器 過濾器就是向web應用程式的請求和和響應添加功能的組件。過濾器能夠實現客戶端和目標資源之間的交互信息進行篩選和過濾,最終保留有效的數據信息。 二、過濾器的生命周期 2.1 實例化。 web容器複製創建過濾器的實例來完成過濾器的實例化,只會實例化一次。 2.2 初始化。 在進行過濾工作前會 ...
  • 一、servlet的概念 Servlet是一種獨立與平臺和協議的伺服器端java應用程式,通過Servlet可以生成動態web頁面,同時使用Servlet還可以在伺服器端對客戶的請求進行處理,控製程序的執行。 Servlet的主要作用就是互動式的瀏覽和更新數據,並生成動態的頁面內容展示。 1. 服務 ...
  • 題目:輸入兩個鏈表,找出它們的第一個公共節點。鏈表的定義如下: 思路1:採用蠻力的方法:在第一個鏈表上順序遍歷每個節點,每遍歷到一個節點的時候,在第二個鏈表上順序遍歷每個節點。如果第二個鏈表上的節點和第一個鏈表上的節點一樣,就說明兩個鏈表在節點上重合,於是就找到了公共的節點。而通常蠻力並不是好的方法 ...
  • HTTP 應用的信息是通過 請求報文 和 響應報文 傳遞的,關於更多的相關知識,可以閱讀《HTTP權威指南》獲得。 其中 請求報文 由客戶端發送,其中包含和許多的信息,而 django 將這些信息封裝成了 HttpRequest 對象,該對象由 HttpRequest 類創建。每一個請求都會生成一個 ...
  • 這周還是在改自己的這個框架,被多線程折騰了兩天,最終無奈放棄在游戲啟動時調用引擎進行圖片相關資源的初始化,當然進展還是不錯的。 嗯,下麵還是以流水的方式繼續記錄一下本周完成的工作: 1、調通了客戶端與lua的相互調用,用的是verysimple這個第三方庫(跨平臺的庫)。這邊遇到一個坑,特此記錄。 ...
  • 1基礎理論部分 分頻,是的,這個概念也很重要。分頻是指將一單一頻率信號的頻率降低為原來的1/N,就叫N分頻。實現分頻的電路或裝置稱為“分頻器”,如把33MHZ的信號2分頻得到16.5MHZ的信號,3分頻得到11MHZ的信號,10分頻得到3.3MHZ的信號。 分頻主要是相對於主晶振來說,用不到那麼高的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...