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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...