類與對象(上)

類與對象(上)

  • 一、面向過程和面向對象的區別
  • 二、類
    • 1、類的引入
    • 2、類的定義
      • (1)類的基本定義
      • (2)類的成員函數的定義方法
    • 3、類的訪問限定符
    • 4、封裝
    • 5、駝峰法命名規則
    • 6、類的作用域
    • 7、類的實例化
      • (1)實例化的概念與作用
      • (2)類沒有實例化對象
      • (3)類有實例化對象
    • 8、生命周期與作用域的關系
  • 三、類對象模型
    • 1、類對象的存儲方式(只保存成員變量,成員函數存放在公共的代碼區中)
    • 2、C語言結構體內存對齊規則
    • 3、計算類對象的大小
  • 四、this指針
    • 1、示例代碼
    • 2、this指針的作用
    • 3、成員函數的實際參數與錯誤
    • 4、this指針的特性

一、面向過程和面向對象的區別

在學習C++之前,我們已經學了C語言,而C語言是面向過程的計算機語言,關注的是過程,即要求編程者分析出求解問題的步驟,進而通過函數調用的方式逐步解決問題;而C++是基于面向對象的計算機語言,關注的是對象,即將一件事情拆分成不同的對象,靠對象之間的交互完成要求。但是,因為C++是在C語言的基礎之上創建出來的計算機語言,所以C++是兼容C語言的,即C++不是純面向對象的語言,它可以面向對象和面向過程混編。

二、類

1、類的引入

在C語言中,有結構體struct的概念,在C++中,因為它兼容C語言的緣故,所以struct在C++中可以是結構體,但確切的說它升級成為了類,而類與結構體最明顯的兩個區別就是能在類里面定義函數和有訪問權限的概念。比如用C語言實現棧(參見棧與隊列),里面的結構體中只能有成員變量而不能有成員函數,所以,實現棧的一系列函數只能在結構體外去實現。但是,在C++中使用類時更喜歡用class而不是struct,雖然兩者在C++中都是類,但class的默認訪問權限為private,而struct的默認訪問權限為public。

2、類的定義

(1)類的基本定義

class className
{//類體:由成員函數和成員變量組成
};  //記得加上分號
  • class為定義類的關鍵字,ClassName為要定義的類的名字,{}中的內容為類的主體,在類定義結束時,}后面的分號不能省略。
  • 類體中的內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的方法或者成員函數。

(2)類的成員函數的定義方法

  • 聲明和定義全部放在類體中,編譯器可能會將其當成內聯函數處理。
class Person
{
public:void ShowInfo(){cout << _name << " " << _sex << " " << _age << endl;}
private:char* _name;char* _sex;int _age;
};
  • 類的成員函數的聲明放在.h文件中,成員函數的定義放在.cpp文件中,此時在成員函數的定義中,成員函數名前需要加類名::。
    在這里插入圖片描述
  • 如果類的成員函數比較小,能夠成為inline函數,則可以直接在類里面定義,而如果是大函數、遞歸的成員函數,則應該用聲明和定義分離的方法定義成員函數。這樣代碼比較簡潔,可讀性比較高,閱讀用這種方法所寫的代碼時能夠比較容易地了解類的作用。
  • 什么樣的函數適合inline函數參見萬字講解C++基礎

3、類的訪問限定符

在這里插入圖片描述

  • public修飾的成員在類外可以直接被訪問。
  • protected和private修飾的成員在類外不能直接被訪問,即只能在類里面訪問,而在此處protected和private的作用是相似的。
  • 訪問限定符的訪問權限作用域從該訪問限定符出現的位置開始,到下一個訪問限定符出現時結束或者后面沒有訪問限定符了,則到 }結束。
  • 訪問限定符只在編譯時有用,當數據映射到內存后,被訪問限定符修飾的所有成員沒有任何區別。

4、封裝

將數據和操作數據的方法(類的成員函數)進行有機結合,隱藏對象的屬性和實現細節,僅對外公開接口和對象進行交互。

5、駝峰法命名規則

  • 函數名、類名等所有單詞首字母大寫,如SnowDragon
  • 變量首字母小寫,后面單詞首字母大寫,如snowDragon
  • 成員變量,首單詞前面加_,如_snowDragon

6、類的作用域

類似于函數、循環等等,它們都具有作用域,類也具有作用域,即類的{}所括起來的區域。類的所有成員都被包含在這個作用域中。當在類的類體外定義成員時,需要使用::作用域操作符指明定義的成員屬于哪個類域。

7、類的實例化

(1)實例化的概念與作用

  • 用類類型創建對象的過程,稱為類的實例化。
  • 類是對對象進行描述的,即它是一個像模型一樣的東西,限定了類具有的成員,定義完成一個類時,編譯器并沒有分配實際的內存空間出來,即此時的類不能存儲數據。
  • 一個類可以實例化出多個對象,而實例化出的對象是具有實際的物理空間的,即它們能夠存儲類的成員變量的數據。

(2)類沒有實例化對象

在這里插入圖片描述

(3)類有實例化對象

在這里插入圖片描述

  • 因為類是定義在全局作用域中的,而main函數是在類外,所以此處要在main函數中調用類的成員變量時,得將類中類的成員變量用public訪問限定符修飾,否則無法進行訪問。
  • 對_name和_sex成員變量賦值時,由于上圖的代碼在main函數中是用常量字符串對其進行賦值,所以_name和_sex需用const進行修飾。
    在這里插入圖片描述

8、生命周期與作用域的關系

  • 作用域影響變量的訪問,但不影響變量的生命周期。
  • 生命周期與變量存儲的位置有關,當變量所在的空間是在棧上的,當變量所在的作用域結束時,該作用域在棧上的空間將被操作系統回收,而變量也在這塊被回收的空間中,即它的生命周期也結束了。

三、類對象模型

1、類對象的存儲方式(只保存成員變量,成員函數存放在公共的代碼區中)

在這里插入圖片描述

  • 如果要調用類的成員函數,編譯器會在編譯鏈接時根據函數名去公共代碼區找到被調用的函數的地址,用反匯編的方式查看時,會有call該函數的地址的代碼。

2、C語言結構體內存對齊規則

  • 第一個成員從在與結構體偏移量為0的地址處開始存儲。
  • 對齊數為在編譯器默認的對齊數與該成員類型的大小中的較小值(VS編譯器中的默認對齊數為8)。
  • 其他成員變量要對齊到對齊數的整數倍的地址處才可以開始存儲。
  • 結構體總大小為:最大對齊數(所有變量對齊數的最大值與默認對齊數,兩者中最小的那個)的整數倍。
  • 如果嵌套了結構體,嵌套的結構體對齊到自己的最大對齊數的整數倍處,而結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。

3、計算類對象的大小

  • 一個類的大小就是該類中所有成員變量的大小之和,計算大小總和的方法要注意內存對齊規則。
  • 如果類為空類,編譯器會給該類一個字節來唯一標識這個類的對象。

四、this指針

1、示例代碼

class Date
{
public:void Init(int year, int month, int day){//this = nullptr;_year = year;_month = month;_day = day;}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Init(2023, 8, 15);d1.Print();Date d2;d2.Init(2023, 8, 16);d2.Print();return 0;
}

2、this指針的作用

  • 在上方的示例代碼Date類中,有Init與Print兩個成員函數,但在兩個函數的函數體中沒有關于不同對象的區分,那當d1調用Init函數時,該函數是通過this指針進行訪問并設置對象。
  • 即C++編譯器給每個”非靜態的成員函數“增加了一個隱藏的指針作為函數的形式參數,讓該指針指向當前對象(函數運行時調用該函數的對象),在函數體中對所有“成員變量”的操作都是通過這個指針去訪問的。只不過所有的操作對用戶都是透明的,即用戶不需要自己傳遞當前對象的地址作為參數,編譯器會自動完成這些操作。

3、成員函數的實際參數與錯誤

在這里插入圖片描述

4、this指針的特性

  • this指針的類型:類類型* const,因為this被const修飾了,所以在成員函數中,不能給this指針賦值(上方代碼中注釋掉的那行代碼)且只能在“成員函數”的內部使用。
  • this指針本質上是“成員函數”的形參,當對象調用成員函數時,編譯器會將對象的地址作為實參傳遞給this形參,因為this是形參,所以它存在棧上。
  • this指針是類的成員函數的形式參數中第一個隱含的指針形參,在VS編譯器下,傳給this的實參是通過ecx寄存器自動傳遞的,不需要用戶自己填寫該實參。而用寄存器傳遞會提高this訪問變量的效率,是否對this指針進行優化是由編譯器決定的。
  • 只要類的成員函數內部不需要this進行訪問,則該成員函數的this指針可以為空,即調用這個成員函數的對象可以為nullptr。
  • 實參和形參位置不能顯示傳遞和接收this指針,但是可以在成員函數內部使用this指針。

本文到這里就結束了,如有錯誤或者不清楚的地方歡迎評論或者私信
創作不易,如果覺得博主寫得不錯,請務必點贊、收藏加關注💕💕💕

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金蝶軟件實現導入Excel數據分錄行信息到單據體分錄行中

>>>適合KIS云專業版V16.0|KIS云旗艦版V7.0|K/3 WISE 14.0等版本<<< 金蝶軟件中實現[導入Excel數據業務分錄行]信息到[金蝶單據體分錄]中,在采購訂單|采購入庫單|銷售訂單|銷售出庫單等類型單據中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地從…

IntelliJ IDEA(簡稱Idea) 基本常用設置及Maven部署---詳細介紹

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 眾所周知&#xff0c;現在有許多編譯工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要學的Idea編譯工具 Idea是JetBrains公司開發的一款強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

Rancher管理K8S

1 介紹 Rancher是一個開源的企業級多集群Kubernetes管理平臺&#xff0c;實現了Kubernetes集群在混合云本地數據中心的集中部署與管理&#xff0c;以確保集群的安全性&#xff0c;加速企業數字化轉型。Rancher 1.0版本在2016年就已發布&#xff0c;時至今日&#xff0c;Ranche…

2023牛客第七場補題報告C F L M

2023牛客第七場補題報告C F L M C-Beautiful Sequence_2023牛客暑期多校訓練營7 (nowcoder.com) 思路 觀察到數組一定是遞增的&#xff0c;所以從最高位往下考慮每位的1最多只有一個&#xff0c;然后按位枚舉貪心即可。 代碼 #include <bits/stdc.h> using namespac…

CS:GO升級 Linux不再是“法外之地”

在前天的VAC大規模封禁中&#xff0c;有不少Linux平臺的作弊玩家也迎來了“遲到”的VAC封禁。   一直以來&#xff0c;Linux就是VAC封禁的法外之地。雖然大部分玩家都使用Windows平臺進行游戲。但實際上&#xff0c;使用Linux暢玩CS:GO的玩家也不在少數。 以前V社主要打擊W…

Linux上安裝和使用git到gitoschina和github上_親測

Linux上安裝和使用git到gitoschina和github上_親測 git介紹與在linux上安裝創建SSHkey在git-oschina使用maven-oschina使用在github使用maven-github使用組織與倉庫 【git介紹與在linux上安裝】 Git是一款免費、開源的分布式版本控制系統&#xff0c;用于敏捷高效地處理任何…

uniapp隱藏底部導航欄(非自定義底部導航欄)

uniapp隱藏底部導航欄 看什么看&#xff0c;要多看uni官方文檔&#xff0c;里面啥都有 看什么看&#xff0c;要多看uni官方文檔&#xff0c;里面啥都有 uniapp官方網址&#xff1a;uni設置TabBar // 展示 uni.showTabBar({animation:true,success() {console.debug(隱藏成功)…

【LVS】1、LVS負載均衡群集

1.群集的含義&#xff1a; Cluster、群集、集群 由多臺主機構成并作為一個整體&#xff0c;只提供一個訪問入口&#xff08;域名與IP地址&#xff09;&#xff1b;可伸縮 2.集群使用的場景&#xff1a; 高并發 3.企業群集的分類&#xff1a; 根據群集所針對的目標差異&a…

06-微信小程序-注冊程序-場景值

06-微信小程序-注冊程序 文章目錄 注冊小程序參數 Object object案例代碼 場景值場景值作用場景值列表案例代碼 注冊小程序 每個小程序都需要在 app.js 中調用 App 方法注冊小程序實例&#xff0c;綁定生命周期回調函數、錯誤監聽和頁面不存在監聽函數等。 詳細的參數含義和使…

【LeetCode】543.二叉樹的直徑

題目 給你一棵二叉樹的根節點&#xff0c;返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 示例 1&#xff1a; 輸入&#xff1a;root [1,2,3,4,5]…

每日一學——網絡安全

網絡安全設計、原則、審計等知識點的精講如下&#xff1a; 網絡安全設計與原則&#xff1a; 網絡安全設計是指在系統或網絡的設計過程中考慮到安全性&#xff0c;并采取相應的安全措施來保護系統或網絡不受威脅。安全設計原則包括最小權限原則&#xff08;Least Privilege Prin…

高并發內存池(centralcache)[2]

Central cache threadcache是每個線程獨享&#xff0c;而centralcache是多線程共享&#xff0c;需要加鎖&#xff08;桶鎖&#xff09;一個桶一個鎖 解決外碎片問題&#xff1a;內碎片&#xff1a;申請大小超過實際大小&#xff1b;外碎片&#xff1a;空間碎片不連續&#x…

跨境電商ERP源碼大揭秘,讓你少走彎路

本文將深入介紹跨境電商ERP源碼的重要性以及如何選擇和應用它們&#xff0c;讓你的電商業務更高效、順暢。 跨境電商ERP源碼的重要性 提升管理效率 跨境電商運營面臨著眾多挑戰&#xff0c;如訂單管理、庫存追蹤和財務報告等。跨境電商ERP源碼能夠集成這些功能&#xff0c;幫…

自動駕駛,一次道阻且長的遠征|數據猿直播干貨分享

?數據智能產業創新服務媒體 ——聚焦數智 改變商業 在6月的世界人工智能大會上&#xff0c;馬斯克在致辭中宣稱&#xff0c;到2023年底&#xff0c;特斯拉便可實現L4級或L5級的完全自動駕駛&#xff08;FSD&#xff09;。兩個月之后&#xff0c;馬斯克又在X社交平臺上發言&am…

java面試強基(16)

目錄 clone方法的保護機制 Java中由SubString方法是否會引起內存泄漏&#xff1f; Java中提供了哪兩種用于多態的機制? 程序計數器(線程私有) 如何判斷對象是否是垃圾&#xff1f; clone方法的保護機制 clone0方法的保護機制在Object中是被聲明為 protected的。以User…

1000元到3000元預算的阿里云服務器配置大全

1000元、2000元或3000元預算能夠買的阿里云服務器配置有哪些&#xff1f;可以選擇ECS通用算力型u1云服務器、ECS計算型c7或通用型g7實例規格&#xff0c;當然&#xff0c;如果選擇輕量應用服務器的話&#xff0c;更省錢&#xff0c;阿里云百科分享1000-3000元預算能買的阿里云服…

三、Dubbo 注冊中心

三、Dubbo 注冊中心 3.1 注冊中心概述 主要作用 動態加入&#xff1a;服務提供者通過注冊中心動態地把自己暴露給其他消費者動態發現&#xff1a;消費者動態地感知新的配置、路由規則和新的服務提供者動態調整&#xff1a;注冊中心支持參數的動態調整&#xff0c;新參數自動更…

如何用輕葉H5制作一份調查問卷

在營銷落地頁中&#xff0c;問卷類H5是一種制作簡單&#xff0c;易于傳播的落地頁&#xff0c;通過精巧的設計和嚴密的邏輯設置&#xff0c;問卷類H5的投放效果也是不容小覷的。 問卷類H5在制作中有以下不可缺少的要素&#xff1a; 清晰的標題和簡要的說明 標題應該簡明扼要地…

用pytorch實現AlexNet

AlexNet經典網絡由Alex Krizhevsky、Hinton等人在2012年提出&#xff0c;發表在NIPS&#xff0c;論文名為《ImageNet Classification with Deep Convolutional Neural Networks》&#xff0c;論文見&#xff1a;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf &#xf…