C++基礎之面向對象

来源:https://www.cnblogs.com/jalja365/archive/2020/05/27/12956220.html
-Advertisement-
Play Games

在編寫程式時,使用3種基本控制結構來構造程式。可以說,程式基本上都含有順序、選擇、迴圈3種基本控制結構,這3種結構到目前為止仍是主要的控制結構。程式以控制結構為單位,只有一個入口和一個出口,基於控制結構可以從前往後地順序閱讀程式,程式的靜態描述與執行時的控制流程容易對應,所以可以獨立地理解各個部分。... ...


一、結構化程式設計與面向對象程式設計

1、結構化程式設計

  • 在結構化程式設計中,採用自頂向下、逐步求精及模塊化的思想,將複雜的大問題層層分解為許多簡單的小問題。
  • 在編寫程式時,使用3種基本控制結構來構造程式。可以說,程式基本上都含有順序、選擇、迴圈3種基本控制結構,這3種結構到目前為止仍是主要的控制結構。程式以控制結構為單位,只有一個入口和一個出口,基於控制結構可以從前往後地順序閱讀程式,程式的靜態描述與執行時的控制流程容易對應,所以可以獨立地理解各個部分。結構化程式設計主要強調的是程式的易讀性

2、面向對象程式設計的概念和特點

  • 所謂面向對象的程式設計方法,就是使分析、設計和實現一個系統的方法儘可能地接近人們認識一個系統的方法。通常包括3個方面:面向對象的分析、面向對象的設計和麵向對象的程式設計
  • 面向對象技術把問題看成是相互作用的事物的集合,也就是對象的集合。對象具有兩個特性:一是狀態;狀態是指對象本身的信息,也稱為屬性二是行為,行為是對對象的操作。通過對事物的抽象找出同一類對象的共同屬性(靜態特征)和行為(動態特征),從而得到類的概念。對象是類的一個具象,類是對象的一個抽象

3、面向對象的程式設計有“抽象”“封裝”“繼承”和“多態”4個基本特點。

  • 抽象:對象是系統中用來描述客觀事物的一個實體,如各位員工是員工類的一個個對象。對象的特點包括兩個方面:屬性和操作。屬性指的是描述對象靜態特征的數據項,如員工的姓名、職位、薪水等,可以用變數來表示;操作指的是描述對象動態特征(即行為)的函數序列,也稱為方法或服務,如員工可以請假、加班,員工還可以獲得提拔、加薪等。C++中使用對象名、屬性和操作三要素來描述對象
  • 封裝:在C++中,通過用戶定義的類來支持數據封裝和信息隱藏
  • 繼承:在C++現有類的基礎上可以聲明新的類,將一個已有類中的數據和函數保留,並加上自己特殊的數據和函數,從而構成一個新類,這就是繼承和復用的思想。原來的類是基類,也稱為父類或超類。新類是派生類,也稱為子類
  • 多態:多態是指不同種類的對象都具有名稱相同的行為,而具體行為的實現方式卻有所不同。在一個類或多個類中,可以讓多個方法使用同一個名字,從而具有多態性。這是通過函數重載及運算符重載實現的多態

二、類的定義

  1. 字母、數字和下劃線的組合,大小寫敏感,但不能以數字開頭,也不能和系統中使用的關鍵字完全相同。
  2. 類是具有唯一標識符的實體,就是說類名不能重覆。類定義以“;”結束,大括弧中的部分稱為類體。
  3. 定義類時系統並不為類分配存儲空間,而只是把類看作是一種模板或樣板。或者說,類可以看作是用戶自定義的一種數據類型。在C++98標準下,類中聲明的任何成員不能使用auto、extern和register關鍵字進行修飾。
  4. 類中的成員按功能劃分,包括成員變數和成員函數;按訪問許可權劃分,包括公有成員成、私有成員和保護員。
  5. 在C++中還可以定義不是任何類的成員的函數,這樣的函數可稱為“全局函數”
  6. 成員函數既可以在類體內定義,也可以在類體外定義。如果成員函數定義在類體內部,則預設是內聯函數。也可以在類體內部聲明函數,並加上inline關鍵字,然後在類體外給出函數定義,這樣的成員函數也是內聯函數。
  7. 如果成員函數定義在類體外,則類體內必須要有函數原型,類體外函數定義的前面必須用“類名::”來限定,格式如下:
  8. 返回值類型 類名::成員函數名(參數列表){
      成員函數的函數體
    }
  9. 類名是成員函數所屬類的名字,符號::是類作用域運算符,表明它後面的成員函數是屬於類名標識的這個類的。返回值類型就是這個成員函數返回值的類型。
  10. 類C中不能定義類C的成員變數,但可以定義類C的指針和引用。
  11. 成員函數並非每個對象各自存有一份。成員函數和普通函數一樣,在記憶體中只有一份,它可以作用於不同的對象,為類中各對象共用。
  12. 通常,因為函數體代碼較長,所以在類體內僅給出成員函數的原型,然後在類體外給出對應的函數體。如果函數體定義在類體內,則系統將其視為內聯函數。類中定義的成員函數允許重載。

 

 

 三、C++程式結構

一個完整的C++程式包括以下幾部分:

  • ✓ —個主函數,可以調用其他函數,但不能被調用,也稱為主程式。
  • ✓ 用戶定義的任意多個的類及全局函數。
  • ✓ 全局說明。在所有函數和類定義之外的變數說明及函數原型。
  • ✓ 註釋。
  • ✓ 頭文件。
  • 對於比較大的程式,根據主函數和各用戶定義的類及全局函數的功能及相互關係,可以把類及全局函數劃分為幾個程式文件,包括.cpp文件和.h文件。.cpp文件是源程式文件,.h文件是頭文件。
  • 從邏輯關係上看,典型的C++程式的結構包括類的定義、類中成員函數的實現及主函數main。

四、Class 中的訪問許可權

  • public(公有的): 使用它修飾的類的成員可以在程式的任何地方被訪問。
  • private(私有的): 使用它修飾的類的成員僅能在本類內被訪問。
  • protected(保護的): 它的作用介於public與private之間,使用它修飾的類的成員能在本類內及子類中被訪問。
  • 私有類型的成員在類外是不能訪問的,通過公有函數訪問的效率比直接訪問的效率要低。為了權衡這兩方面的因素,C++提供了友元訪問方式。只有在類內和在友元函數內才可以訪問私有成員。

五、Class 的使用

1、構造函數

  • 為了對對象進行初始化,C++提供了一種稱為構造函數的機制,用於對對象進行初始化,實際上是用來為成員變數賦初值的。
  • 構造函數是類中的特殊成員函數,它屬於類的一部分。給出類定義時,由程式員編寫構造函數。如果程式員沒有編寫類的任何構造函數,則由系統自動添加一個不帶參數的構造函數。
  • 聲明對象後,可以使用new運算符為對象進行初始化,此時調用的是對象所屬類的構造函數。構造函數的作用是完成對象的初始化工作,用來保證對象的初始狀態是確定的。在對象生成時,系統自動調用構造函數,用戶在程式中不會直接調用構造函數。
  • 定義一個類時,需要為類定義相應的構造函數。構造函數的函數名與類名相同,沒有返回值。一個類的構造函數可以有多個,即構造函數允許重載。同一個類的多個構造函數的參數表一定不能完全相同。
  • 當類中沒有定義任何構造函數時,系統會自動添加一個參數表為空、函數體也為空的構造函數,稱為預設構造函數。所以任何類都可以保證至少有一個構造函數。如果程式員在程式中已經定義了構造函數,則系統不會再添加預設構造函數。
  • 在聲明類的構造函數時可以同時給出函數體,這樣的構造函數稱為內聯構造函數。也可以在類體外給出構造函數的定義。構造函數的聲明中,形參的個數可以為0,即參數表為空

構造函數的格式:

構造函數的聲明格式如下:類名(形參1, 形參2, …,形參n)
在類體外定義構造函數時通常有三種形式
//形式一:
類名::類名(形參1,形參2,…,形參n):x1(形參1), x2(形參2), …, xn(形參n){}
//形式二:
類名::類名(形參1,形參2,…,形參n){
    x1=形參1;
    x2=形參2;
    ……
    xn=形參n;
}
//形式三:
類名::類名(){
    x1=初始化表達式1;
    x2=初始化表達式2;
    ……
    xn=初始化表達式n;
}

初始化時機:定義類的成員函數、成員對象及友元函數時,均不調用類的構造函數。僅當定義類的對象時,才由系統自動調用類的構造函數

構造函數的使用:

  • C++語言規定,創建類的任何對象時都一定會調用構造函數進行初始化。對象需要占據記憶體空間,生成對象時,為對象分配的這段記憶體空間的初始化由構造函數完成。
  • 數組:特別地,如果程式中聲明瞭對象數組,即數組的每個元素都是一個對象,則一定要為對象所屬的這個類定義一個無參的構造函數。因為數組中每個元素都需要調用無參的構造函數進行初始化,所以必須要有一個不帶參數的構造函數。
class Person{
private:
    int id;
    string name;
public:
    Person();
    Person(int id,string name);
    ~Person();
    void setName(string name);
    string getName();
    void setId(int id);
    int getId();
    static void print(Person *person){
        cout<< "id:" << person->id << " name:" << person->name <<endl;
        delete person;
    }
};
Person::Person(){
    cout<<"無慘構造函數" <<endl;    
}
Person::Person(int id,string name){
    this->id=id;
    this->name=name;
    cout << "有2個參數的構造函數" <<endl;
}
int main(){
    Person pe();
    Person pe2=Person(1,"張三");
}

1、使用new關鍵字

用new創建對象時返回的是一個對象指針,這個指針指向本類剛創建的這個對象。C++分配給指針的僅僅是存儲指針值的空間,而對象所占用的空間分配在堆上。使用new創建的對象,必須用delete來撤銷。

    //4、類名 *對象指針名 = new 類名;
    Student *stu4=new Student(3,'D');
    cout<< stu4->getName() <<endl;

類名 &對象引用名 = 對象;

    Student stu3=Student(3,'C');
    Student &str4=stu3;
    cout << str4.getName()<<endl;

類名 *對象指針名 = 對象的地址;

    Student stu3=Student(3,'C');
    Student *str4=&stu3;
    cout << str4->getName()<<endl;

類名 對象數組名[數組大小];

    Student stu3[10];
    Student stu4=Student(3,'C');
    stu3[0]=stu4;

同類型的對象之間可以相互賦值。對象和對象指針都可以用作函數參數。函數的返回值可以是對象或指向對象的指針。

 


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

-Advertisement-
Play Games
更多相關文章
  • 基礎 1. 簡介 Django是一個由Python寫成的開放源代碼的重量級Web應用框架。 Django的目的是使常見的Web開發任務,快速和容易 2. 特點 MVC開發模式 內置進行快速web開發所需的各種組件 利用ORM(對象關係映射)機制來定義資料庫,使開發人員可以構造出獨立於具體資料庫引擎的 ...
  • 截至 Laravel 7,共有 6 個可用的緩存驅動程式,其中 APC 是最佳實踐,而文件驅動程式是唯一不需要額外設置的驅動程式。 我昨晚與一位朋友交談,他提到他們使用 Redis 作為緩存驅動程式,這讓我想到我還有一個仍然使用文件驅動程式的項目。 我想我可以使用一些記憶體驅動緩存,以獲得更好的性能, ...
  • 案例故事: 場景一:反覆重啟Android終端產品100次,每重啟一次錄一個視頻; 場景二:做壓力測試比如Monkey一晚上,我們需要涉及長時間錄像; 場景三:做自動化測試的時候,跑一條自動化用例,錄製每條用例執行的整個過程視頻。 許多需要長時間的壓測的場景,我們都可以通過攝像頭錄像記錄下被測試設備 ...
  • Java 四種訪問許可權 一、概述 訪問等級比較:public > protected > default > private 無論是方法還是成員變數,這四種訪問許可權修飾符作用都一樣 public:不管包外包內,所有類(子類+非子類)均可使用 protected 包內:所有類可使用 包外:子類可使用, ...
  • JAVA 每次從List中取出100條記錄 package com.blmlove; import java.util.*; public class Test { public static void main(String[] args) { Test test = new Test(); Li ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 這次數據可視化,我差點認輸了 故事的開頭是,昨天#5000億資產是什麼水平#上了熱搜,因為賭王的離去,他的家產公佈激起各種白日夢想家的誕生,坐我旁邊的小師妹也算了半天要是放餘 ...
  • 前段時間做項目時候,想要在不改變方法簽名的情況下,給 Model::find 方法做個緩存。而且想要做到即插即用。 1.先看一下當我們調用 find 方法時,框架幹了什麼? 找到 Illuminate\Database\Eloquent\Model 的代碼,搜索 find,沒有該方法。看來是走了 _ ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 先來看看繪製的動態水球圖:沒有安裝PyEcharts的,先安裝PyEcharts: # 安裝pyecharts模塊,直接安裝就是最新的版本 pip install pyech ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...