C++面向對象編程入門:從類與對象說起(一)

C語言是面向過程,關注的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題,而C++面向的是對象,關注的是對象,將一件事拆解成多個對象,靠對象之間互交完成。

目錄

類的定義

類的兩種定義

類的訪問限定符及封裝

struct和class的區別:

類的作用域

封裝

類的實例化

類的對象大小

this指針

this指針的特性?


類的定義

#include<iostream>
using namespace std;class className
{// 類體:由成員函數和成員變量組成};  // 一定要注意后面的分號

class為定義類的關鍵字,className是類名,可以自己定義,括號里面就是類體:由成員函數和成員變量組成,括號后面需要帶分號。

類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或者 成員函數。 ?

類的兩種定義

第一種定義方式:將函數聲明和定義都放類體中,需注意:成員函數如果在類中定義,編譯器可能會將其當成內 聯函數處理。

示例:

#include<iostream>
using namespace std;class student {
public:void print(){cout << age << endl;}
private:int age;
};

第二種定義:類聲明放在頭文件.h中,函數的定義在類中放在源文件.cpp中。注意:成員函數名前需要加類名::?

這里有一個變量命名的建議:

?在聲明變量時在前面加一個_更方便理解,不然在初始化時都使用age名稱容易混淆,在上面代碼中_age是聲明的變量,age是形參,將形參的值賦給聲明的變量_age。

類的訪問限定符及封裝

C++實現封裝的方式:用類將對象的屬性與方法結合在一塊,讓對象更加完善,通過訪問權限選 擇性的將其接口提供給外部的用戶使用。

訪問限定符說明:

1. public修飾的成員在類外可以直接被訪問

2. protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)

3. 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止

4. 如果后面沒有訪問限定符,作用域就到 } 即類結束。

5. class的默認訪問權限為private,struct為public(因為struct要兼容C)

注意:訪問限定符只在編譯起作用,當數據映射到內存上時,就訪問限定符沒有區別。

struct和class的區別:

struct?里也可以聲明和定義函數,因為c++要兼容c,而在class中如果不加任何訪問限定符默認的就是private(私有的),在struct中默認是public(共有的)。

類的作用域

類定義了一個新的作用域,類的所有成員都在類的作用域中。如果出了類的作用域定義函數就需要再函數前加::作用域限定符。

示例:

#include<iostream>
using namespace std;class student {
public:void Init(int age);
private:int _age;
};void student::Init(int age)
{_age = age;
}

封裝

封裝:將數據和操作數據的方法有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來實現和對象互交

封裝本質上是一種管理,讓用戶更方便操作類。

在C++語言中實現封裝,可以通過類將數據以及操作數據的方法進行有機結合,通過訪問權限來 隱藏對象內部實現細節,控制哪些方法可以在類外部直接被使用。

類的實例化

用類類型來創建對象,叫做類的實例化。

在還沒有創建對象時,定義一個類并沒有分配實際的空間,就像是一個模型一樣,當創建一個或者多個對象才會分配空間。

類的對象大小

示例:

#include<iostream>
using namespace std;class A {
public:void print(){cout << "A" << endl;}
private:char _a;
};int main()
{A a;cout << sizeof(a) << endl;return 0;
}

上面代碼對象a的大小為多少呢?函數會不會算在里面呢?

看看運行結果:

?結果對象a的大小為1,只算了_a的大小,那函數大小不算的嗎?事實上就是不算函數的大小,函數放在公共的代碼區,每個創建的對象都可以去公共代碼區調用函數,當然計算類的大小時還需要注意內存對齊規則,和結構體內存對齊規則是一樣的。

當這個類只有函數或者為空類時,大小為1,那為什么不是0呢?如果類中只有函數或者為空類的大小為0,那么就在內存中沒有地址,那怎么找到類中的地址呢?沒有成員變量的類對象,需要1byte,是為了占位,表示對象存在。所以一個類的大小,實際就是該類中”成員變量”之和,當然要注意內存對齊 注意空類的大小,空類比較特殊,編譯器給了空類一個字節來唯一標識這個類的對象。

this指針

先看這段代碼:

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year; int _month;int _day;
};int main()
{Date d1, d2;d1.Init(2022, 1, 11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0;
}

?為什么創建兩個對象去調用Print可以輸出不同的結果?

在這里就用了this指針,C++編譯器給每個“非靜態的成員函數“增加了一個隱藏 的指針參數,讓該指針指向當前對象(函數運行時調用該函數的對象),在函數體中所有“成員變量” 的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。

注意:this指針不能再形參和實參顯示傳遞,但是可以在函數內部中使用

?示例:

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << this->_year << "-" << this->_month << "-" << this->_day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1, d2;d1.Init(2022, 1, 11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0;
}

this指針的特性?

1. this指針的類型:類類型* const,即成員函數中,不能給this指針賦值。

2. 只能在“成員函數”的內部使用

3. this指針本質上是“成員函數”的形參,當對象調用成員函數時,將對象地址作為實參傳遞給 this形參。所以對象中不存儲this指針。

4. this指針是“成員函數”第一個隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳 遞,不需要用戶傳遞

?this指針存放在棧中,因為它是形參,在進入一個函數時需要先對形參壓棧,所以this指針存放在棧中。this在不需要解引用的情況下可以為空,否則不可以為空

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

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

相關文章

uniapp tabBar 中設置“custom“: true 在H5和app中無效解決辦法

uniapp小程序自定義底部tabbar&#xff0c;但是在轉成H5和app時發現"custom": true 無效&#xff0c;原生tabbar會顯示出來 解決辦法如下 在tabbar的list中設置 “visible”:false 代碼如下&#xff1a;"tabBar": {"custom": true,//"cust…

SpringBoot學生操行評分系統源碼設計開發

概述 基于SpringBoot框架開發的學生操行評分系統完整項目&#xff0c;該系統采用主流技術棧開發&#xff0c;包含完善的評分管理功能模塊&#xff0c;是學校管理、教育培訓機構理想的數字化解決方案&#xff0c;非常適合作為設計參考或二次開發基礎項目。 主要內容 5.1 管理…

從代碼學習深度學習 - 單發多框檢測(SSD)PyTorch版

文章目錄 前言工具函數數據處理工具 (`utils_for_data.py`)訓練工具 (`utils_for_train.py`)檢測相關工具 (`utils_for_detection.py`)可視化工具 (`utils_for_huitu.py`)模型類別預測層邊界框預測層連接多尺度預測高和寬減半塊基礎網絡塊完整的模型訓練模型讀取數據集和初始化…

基于STM32的溫濕度光照強度仿真設計(Proteus仿真+程序設計+設計報告+講解視頻)

這里寫目錄標題 **1.****主要功能****2.仿真設計****3.程序設計****4.設計報告****5.下載鏈接** 基于STM32的溫濕度光照強度仿真設計(Proteus仿真程序設計設計報告講解視頻&#xff09; 仿真圖Proteus 8.9 程序編譯器&#xff1a;keil 5 編程語言&#xff1a;C語言 設計編號…

SSH 服務部署指南

本指南涵蓋 OpenSSH 服務端的安裝、配置密碼/公鑰/多因素認證&#xff0c;以及連接測試方法。 適用系統&#xff1a;Ubuntu/Debian、CentOS/RHEL 等主流 Linux 發行版。 1. 安裝 SSH 服務端 Ubuntu/Debian # 更新軟件包索引 sudo apt update# 安裝 OpenSSH 服務端 sudo apt i…

《Python星球日記》 第46天:決策樹與隨機森林

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 專欄:《Python星球日記》,限時特價訂閱中ing 目錄 一、前言二、決策樹算法原理1. 決策樹簡介2. 決策樹的分裂準則(1) 信息熵與信息增益(2) 基尼不純…

Vue2:引入公共JS,通過this調用

tools.js // 圖片加上前綴 baseurl 是請求域名 img 是圖片路徑export function getimgurl(img) {return ${this.$baseurl}${img}}main.js import baseUrl from "/api/baseUrl.js" Vue.prototype.$baseurl baseUrlimport {getimgurl} from /api/tool.js; Vue.protot…

【Hot 100】 146. LRU 緩存

目錄 引言LRU 緩存官方解題LRU實現&#x1f4cc; 實現步驟分解步驟 1&#xff1a;定義雙向鏈表節點步驟 2&#xff1a;創建偽頭尾節點&#xff08;關鍵設計&#xff09;步驟 3&#xff1a;實現鏈表基礎操作操作 1&#xff1a;添加節點到頭部操作 2&#xff1a;移除任意節點 步驟…

【Linux】swap交換分區管理

目錄 一、Swap 交換分區的功能 二、swap 交換分區的典型大小的設置 2.1 查看交換分區的大小 2.1.1 free 2.1.2 cat /proc/swaps 或 swapon -s 2.1.3 top 三、使用交換分區的整體流程 3.1 案例一 3.2 案例二 一、Swap 交換分區的功能 計算機運行一個程序首先會將外存&am…

【計算機網絡】用戶從輸入網址到網頁顯示,期間發生了什么?

1.URL解析 瀏覽器分解URL&#xff1a;https://www.example.com/page 協議&#xff1a;https域名&#xff1a;www.example.com路徑&#xff1a;/page 2.DNS查詢&#xff1a; 瀏覽器向DNS服務器發送查詢請求&#xff0c;將域名解析為對應的IP地址。 3.CDN檢查(如果有)&#…

架空輸電線巡檢機器人軌跡優化設計

架空輸電線巡檢機器人軌跡優化 摘要 本論文針對架空輸電線巡檢機器人的軌跡優化問題展開研究,綜合考慮輸電線復雜環境、機器人運動特性及巡檢任務需求,結合路徑規劃算法、智能優化算法與機器人動力學約束,構建了多目標軌跡優化模型。通過改進遺傳算法與模擬退火算法,有效…

根據窗口大小自動調整頁面縮放比例,并保持居中顯示

vue 項目 直接上代碼 圖片u1.png 是個背景圖片 圖片u2.png 是個遮罩 <template><div id"app"><div class"viewBox"><divclass"screen":style"{ transform: translate(-50%,-50%…

初學Python爬蟲

文章目錄 前言一、 爬蟲的初識1.1 什么是爬蟲1.2 爬蟲的核心1.3 爬蟲的用途1.4 爬蟲分類1.5 爬蟲帶來的風險1.6. 反爬手段1.7 爬蟲網絡請求1.8 爬蟲基本流程 二、urllib庫初識2.1 http和https協議2.2 編碼解碼的使用2.3 urllib的基本使用2.4 一個類型六個方法2.5 下載網頁數據2…

oracle 數據庫sql 語句處理過程

14.1SQL語句處理過程 在進行SQL語句處理優化前&#xff0c;需要先熟悉和了解SQL語句的處理過程。 每種類型的語句在執行時都需要如下階段&#xff1a; 第1步: 創建游標。 第2步: 分析語句。 第5步: 綁定變量。 第7步: t運行語句。 第9步: 關閉游標。 如果使用了并行功能&#x…

pm2 list查詢服務時如何通過name或者namespace進行區分

在 PM2 中&#xff0c;如果 pm2 list 顯示的所有服務名稱&#xff08;name&#xff09;相同&#xff0c;就無法直觀地區分不同的進程。這時可以通過 --namespace&#xff08;命名空間&#xff09; 或 自定義 name 來區分服務。以下是解決方案&#xff1a; 方法 1&#xff1a;啟…

[python] 函數基礎

二 函數參數 2.1 必備參數(位置參數) 含義: 傳遞和定義參數的順序及個數必須一致 格式: def func(a,b) def func_1(id,passwd):print("id ",id)print("passwd ",passwd) func_1(10086,123456) 2.2 默認參數 函數: 為函數的參數提供一個默認值,如果調…

超大規模SoC后仿真流程與優化

在超大規模SoC設計中,是否需要進行全芯片后仿真(Full-Chip Post-layout Simulation)取決于多個因素,包括設計復雜度、項目風險、資源限制以及驗證目標。以下是針對這一問題的系統性分析: 1. 全芯片后仿真的必要性 需要全芯片后仿真的場景 系統級交互驗證: 跨模塊信號交互…

深入理解 Docker 網絡原理:構建高效、靈活的容器網絡

在現代軟件開發中&#xff0c;Docker 已經成為了容器化技術的代名詞&#xff0c;廣泛應用于開發、測試和生產環境。Docker 使得開發者能夠將應用及其依賴打包成一個輕量級的容器&#xff0c;并通過 Docker 容器化技術來實現高效的部署與管理。 然而&#xff0c;在日常使用 Dock…

leetcode 242. Valid Anagram

題目描述 因為s和t僅僅包含小寫字母&#xff0c;所以可以開一個26個元素的數組用來做哈希表。不過如果是unicode字符&#xff0c;那就用編程語言自帶的哈希表。 class Solution { public:bool isAnagram(string s, string t) {int n s.size();if(s.size() ! t.size())return …

4、反應釜壓力監控系統 - /自動化與控制組件/reaction-vessel-monitor

76個工業組件庫示例匯總 反應釜壓力監控組件 這是一個用于反應釜壓力監控的自定義組件&#xff0c;專為化工廠反應釜壓力監控設計。采用蘋果工業風格界面&#xff0c;簡潔優雅&#xff0c;功能實用&#xff0c;易于使用。 功能特點 實時壓力可視化&#xff1a;直觀展示反應…