C++入門學習3

10.類和對象

C語言結構體中只能定義變量,在C++中,結構體內不僅可以定義變量,也可以定義函數。

C++中定義類(結構體)的語法:

class className
{// 類體:由成員函數和成員變量組成}; ?// 一定要注意后面的分號

class為定義類的關鍵字,ClassName為類的名字,{}中為類的主體,注意類定義結束時后面分號不能省略。 類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或者成員函數。(也可以使用struct定義類,但是有一點區別,下面會說到)

類的兩種定義方式:

1.聲明和定義全部放在類體中,需注意:成員函數如果在類中定義,編譯器可能會將其當成內聯函數處理。

2. 類聲明放在.h文件中,成員函數定義放在.cpp文件中,注意:成員函數名前需要加類名::

為方便書寫這里使用第一種,工程中使用第二種較好。

類的訪問限定符及封裝

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

說明:

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

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

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

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

5. class的默認訪問權限為private,struct為public(因為struct要兼容C)如下:struct的函數都是公有的,class從{開始到public之前的函數都是私有的。

注意:訪問限定符只在編譯時有用,當數據映射到內存后,沒有任何訪問限定符上的區別(主波沒理解,后續理解了再更新)

如何計算類對象的大小

如下面這個日期類中既可以有成員變量,又可以有成員函數,那么一個類的對象中包含了什么?如何計算 一個類的大小?

只保存成員變量,成員函數存放在公共的代碼段

從下圖可以得知,只計算成員變量的內存(按照內存對齊的方式計算:寫文章-CSDN創作中心),注意空類,空類比較特殊,編譯器給了空類一個字節來唯一標識這個類的對象。

11.this指針

先觀察下面這個代碼,d1和d2是如何調用Init和print函數完成初始化和打印的呢?

其實是存在一個隱藏的this指針,如下代碼的注釋:

class Date
{
public:void print();   // ==>void Date::print(Date *this)void Init(int year,int month,int day);// ==>void Date::Init(Date *this,int year=0, int month=1, int day=1)private:int _year;int _month;int _day;
};void Date::print()   // void Date::print()==void Date::print(Date *this)
{// ==cout <<this->_year << '-' <<this->_month << '-' << this->_day << endl;cout << _year << '-' << _month << '-' << _day << endl;
}void Date::Init(int year=0, int month=1, int day=1) // ==>void Date::Init(Date *this,int year=0, int month=1, int day=1)
{_year = year;_month = month;_day = day;//this->_year = year;//this->_month = month;//this->_day = day;
}int main()
{Date d1, d2;d1.Init(2025, 8, 9); // ==> d1.Init(&d1,2025, 8, 9);d2.Init(2025, 8, 10);// ==> d2.Init(&d2,2025, 8, 10);d1.print();    // ==> d1.print(&d1);d2.print();    // ==> d2.print(&d2);return 0;
}

12.構造函數

構造函數是一個特殊的成員函數(作用是初始化對象的成員變量),名字與類名相同,創建對象時由編譯器自動調用,以保證每個成員變量都有一個合適的初始值,并且在對象整個生命周期內只調用一次。前面寫的日期類是使用了 Init 函數進行初始化,但是每創建一個對象就得調用這個函數才能初始化,現在使用構造函數就不需要自己手動調用函數初始化創建的對象。

特性:

1. 函數名與類名相同。

2. 無返回值。

3. 創建對象時編譯器自動調用對應的構造函數。

4. 構造函數可以重載。

如下日期類作為例子:

class Date
{
public:// 1.無參構造函數Date(){_year = 0;_month = 1;_day = 1;}// 2.帶參構造函數Date(int year, int month, int day) {_year = year;_month = month;_day = day;}// 參數可以全缺省//Date(int year=0, int month=1, int day=1) //{//   _year = year;// _month = month;// _day = day;//}void print()   // void Date::print()==void Date::print(Date *this){cout << _year << '-' << _month << '-' << _day << endl;}private:int _year;int _month;int _day;
};void TestDate()
{Date d1;             // 調用無參構造函數// Date d1();不能加括號,否則就成了函數聲明d1.print();Date d2(2015, 1, 1); // 調用帶參的構造函數d2.print();
}
int main()
{TestDate();return 0;
}

13.析構函數

與構造函數功能相反,析構函數不是完成對對象本身的銷毀,局部對象銷毀工作是由 編譯器完成的。而對象在銷毀時會自動調用析構函數,完成對象中資源的清理工作。比如:在棧中我們在申請了堆上面申請了空間存儲棧的元素,此時調析構函數就是清理這部分空間,不在像棧那樣需要寫一個銷毀函數destro()。

特性:

1. 析構函數名是在類名前加上字符 ~。

2. 無參數無返回值類型。

3. 一個類只能有一個析構函數。若未顯式定義,系統會自動生成默認的析構函數。注意:析構函數不能重載

4. 對象生命周期結束時,C++編譯系統系統自動調用析構函數。(后創建的對象,在程序結束時會先調用它的析構函數)下圖A類先創建兩個對象接著B類創建兩個對象,main函數結束時,先調用B類對象的析構函數在調用A類對象的析構函數。

如果類中沒有申請資源時,析構函數可以不寫,直接使用編譯器生成的默認析構函數,比如 A,B類;有資源申請時,一定要寫,否則會造成資源泄漏,比如Stack類。(注意下圖打印的指針的地址,證明了特性的第四點)

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

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

相關文章

奇偶校驗碼原理與FPGA實現

奇偶校驗原理與FPGA實現寫在前面一、基礎原理2.1 奇校驗2.2 偶校驗2.3 缺點二、舉個例子3.1 奇校驗例子3.2 偶校驗例子3.3 檢測出錯例子三、FPGA實現寫在后面寫在前面 奇偶校驗碼是一種簡單的檢錯碼&#xff0c;主要用于數據傳輸或存儲過程中檢測奇數個比特錯誤或者偶數個比特錯…

Python中的Lambda函數詳解

Lambda函數&#xff08;匿名函數&#xff09;是Python中一種簡潔的函數定義方式&#xff0c;它允許你快速創建小型、一次性的函數對象而無需使用標準的def關鍵字。1. Lambda函數的基本語法lambda arguments: expressionlambda&#xff1a;定義匿名函數的關鍵字arguments&#x…

進階向:Python編寫網頁爬蟲抓取數據

Python網頁爬蟲入門指南&#xff1a;從零開始抓取數據在當今數據驅動的時代&#xff0c;網絡爬蟲已成為獲取公開信息的重要工具。Python憑借其豐富的庫和簡潔的語法&#xff0c;成為編寫網絡爬蟲的首選語言。本文將詳細介紹如何使用Python編寫一個基礎的網頁爬蟲。什么是網頁爬…

客服Agent革命:智能客服系統的技術實現與效果評估

客服Agent革命&#xff1a;智能客服系統的技術實現與效果評估 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我…

C++-紅黑樹

1、紅黑樹的概念紅黑樹&#xff0c;是一種二叉搜索樹&#xff0c;但在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是Red或 Black。 通過對任何一條從根到葉子的路徑上各個結點著色方式的限制&#xff0c;紅黑樹確保沒有一條路 徑會比其他路徑長出倆倍&#xff0c;…

在Python中避免使用`None`表示特殊情況:函數返回值與異常處理的最佳實踐 (Effective Python 第20條)

在Python編程中&#xff0c;函數的設計與實現直接影響代碼的可讀性、可維護性和健壯性。一個常見的問題是如何處理函數的返回值&#xff0c;尤其是在需要表示某種特殊或異常情況時。許多開發者習慣性地使用None來表示這些特殊情況&#xff0c;但這種方法往往會導致意想不到的錯…

從反射到方法句柄:深入探索Java動態編程的終極解決方案

&#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土壤里生長成璀璨的銀河&#xff1b; &#x1f6e0;? 每一個算法都是我繪制…

算法_python_學習記錄_01

人心的成見是一座大山。一旦有山擋在面前&#xff0c;則很難到達下一站。所需要做的&#xff0c;是穿過這座山。 偶然間看了一個視頻&#xff0c;說的是EMASMA的自動交易策略&#xff0c;這個視頻做的很用心&#xff0c;在入場的時間不僅要看EMA的金叉&#xff0c;還需要看其他…

機器翻譯中的語言學基礎詳解(包括包括語法、句法和語義學等)

文章目錄一、語法&#xff08;Grammar&#xff09;&#xff1a;語言規則的底層框架1.1 傳統語法理論的應用1.2 生成語法&#xff08;Generative Grammar&#xff09;1.3 依存語法&#xff08;Dependency Grammar&#xff09;二、句法&#xff08;Syntax&#xff09;&#xff1a…

MQTT:Dashboard訪問授權

目錄一、認證1.1 創建認證器1.2 多認證器二、授權2.1 ACL文件授權配置2.2 使用內置數據庫授權配置一、認證 認證&#xff1a;就是驗證客戶端的身份。 1.1 創建認證器 選擇認證方式配置數據源配置數據源的相關參數 認證器創建之后&#xff0c;在使用客戶端連接Dashboard時&am…

Serper注冊無反應

google郵箱才行&#xff0c;163郵箱注冊無反應&#xff0c;其他郵箱沒試過 在嘗試websailor系列的時候&#xff0c;需要注冊serper&#xff0c;獲取Google Search Key serper.dev/dashboard

聊聊經常用的微服務

聊聊微服務 架構演變 單體架構&#xff1a; All in One&#xff0c;所有的功能模塊都在一個工程里。 SOA架構&#xff1a; 這個架構當不當正不正&#xff0c;對于現在來說&#xff0c;有點老&#xff0c;甚至需要ESB&#xff0c;WebService之類的&#xff0c;基本不會使用了。…

第十四屆藍橋杯青少年組省賽 編程題真題題解

明天我就要考藍橋杯省賽了&#xff0c;本蒟蒻已瑟瑟發抖&#xff0c;所以現在寫一篇文章。 題目分別為&#xff1a; 1.??????B4270 [藍橋杯青少年組省賽 2023] 特殊運算符 2.B4271 [藍橋杯青少年組省賽 2023] 四葉玫瑰數 3.B4272 [藍橋杯青少年組省賽 2023] 質因數的…

HTML全景效果實現

我將為您創建一個精美的360度全景效果頁面&#xff0c;使用Three.js庫實現沉浸式全景體驗&#xff0c;并提供用戶友好的控制界面&#xff0c;完整代碼看文章末尾。 設計思路 使用Three.js創建全景球體 添加控制面板用于切換不同場景 實現自動旋轉和手動控制選項 添加加載狀…

Python 屬性描述符(描述符用法建議)

描述符用法建議 下面根據剛剛論述的描述符特征給出一些實用的結論。 使用特性以保持簡單 內置的 property 類創建的其實是覆蓋型描述符&#xff0c;__set__ 方法和 __get__ 方法都實現了&#xff0c;即便不定義設值方法也是如此。特性的 __set__ 方法默認拋出 AttributeError: …

Milvus 向量數據庫內存使用相關了解

1、支持 MMap 的數據存儲在 Milvus 中&#xff0c;內存映射文件允許將文件內容直接映射到內存中。這一功能提高了內存效率&#xff0c;尤其是在可用內存稀缺但完全加載數據不可行的情況下。這種優化機制可以增加數據容量&#xff0c;同時在一定限度內確保性能&#xff1b;但當數…

C++編程之旅-- -- --默認成員函數(全詳解)

目錄前言構造函數構造函數形式&#xff1a;構造函數的特性&#xff1a;explicit關鍵字析構函數析構函數的概念析構函數的特性含有類類型的成員變量的類析構函數的調用拷貝構造函數拷貝構造函數的概念拷貝構造函數的特性淺拷貝和深拷貝&#xff1a;拷貝構造函數典型調用場景&…

Linux網絡編程:TCP的遠程多線程命令執行

目錄 前言&#xff1a; 一、前文補充 二、服務端的修改 三、Command類的新增 前言&#xff1a; 好久不見&#xff0c;最近忙于其他事情&#xff0c;就耽誤了咱們的Linux的網絡部分的學習。 今天咱們先來給之前所學的TCP的部分進行一個首尾工作&#xff0c;主要是給大家介紹…

重學React(三):狀態管理

背景&#xff1a; 繼續跟著官網的流程往后學&#xff0c;之前已經整理了描述UI以及添加交互兩個模塊&#xff0c;總體來說還是收獲不小的&#xff0c;至少我一個表面上用了四五年React的前端小卡拉米對React的使用都有了新的認知。接下來就到了狀態管理&#xff08;React特地加…

java web項目入門了解

目錄一、項目流程1. 使用servle2. 使用框架二、了解java web項目構造1. 項目目錄結構2. 查看頁面訪問順序3. 發起請求&#xff1a;jqueryajax4. 接受參數5. JSONJSON 數組三、get和post請求區別一、項目流程 1. 使用servle 有客戶端和服務端&#xff0c;客戶端和服務端進行交…