【C++】 類和對象(上)

1.類的定義

1.1類的定義格式

? class為定義類的關鍵字,后跟一個類的名字,{}中為類的主體,注意類定義結束時后?分號不能省 略。類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量;類中的函數稱為類的?法或 者成員函數。

? 為了區分成員變量,?般習慣上成員變量會加?個特殊標識,如成員變量前?或者后?加_或者m 開頭,注意C++中這個并不是強制的,只是?些慣例,具體看公司的要求。

?? C++中struct也可以定義類,C++兼容C中struct的?法,同時struct升級成了類,明顯的變化是 struct中可以定義函數,?般情況下我們還是推薦?class定義類。

? 定義在類?的成員函數默認為inline。

通俗點來說說呢,類就是struct的升級plus版本,將成員由c語言中struct只能夠是變量增添了函數,下面我們寫一個簡單的日期類

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:// 為了區分成員變量,?般習慣上成員變量 // 會加?個特殊標識,如_ 或者 m開頭 int _year; // year_ m_yearint _month;int _day;
};
int main()
{Date d;d.Init(2024, 3, 31);return 0;
}

可以看出相較于c語言中的struct,類可以以函數作為成員

1.2訪問限定符

我們在上述代碼中,我們看到了其中有public和private,其中是什么意思呢?

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

? public修飾的成員在類外可以直接被訪問;protected和private修飾的成員在類外不能直接被訪 問,protected和private是?樣的,以后繼承章節才能體現出他們的區別。

?? 訪問權限作?域從該訪問限定符出現的位置開始直到下?個訪問限定符出現時為?,如果后?沒有 訪問限定符,作?域就到}即類結束。

? class定義成員沒有被訪問限定符修飾時默認為private,struct默認為public。

? ?般成員變量都會被限制為private/protected,需要給別?使?的成員函數會放為public

?

?在如圖所示我們就可以看到在main函數中,_year并不能被識別,這就是因為_year是被private修飾的

1.3類域

?? 類定義了?個新的作?域,類的所有成員都在類的作?域中,在類體外定義成員時,需要使?::作 ?域操作符指明成員屬于哪個類域。

? 類域影響的是編譯的查找規則,下?程序中Init如果不指定類域Stack,那么編譯器就把Init當成全 局函數,那么編譯時,找不到array等成員的聲明/定義在哪?,就會報錯。指定類域Stack,就是知 道Init是成員函數,當前域找不到的array等成員,就會到類域中去查找。

?

#include<iostream>
using namespace std;
class Stack
{
public:// 成員函數 void Init(int n = 4);
private:// 成員變量 int* array;size_t capacity;size_t top;
};
// 聲明和定義分離,需要指定類域 
void Stack::Init(int n)
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申請空間失敗");return;}capacity = n;top = 0;
}
int main()
{Stack st;st.Init();return 0;
}

2.this指針

? Date類中有Init與Print兩個成員函數,函數體中沒有關于不同對象的區分,那當d1調?Init和 Print函數時,該函數是如何知道應該訪問的是d1對象還是d2對象呢?那么這?就要看到C++給了 ?個隱含的this指針解決這?的問題

我們看看下列代碼?

#include<iostream>
using namespace std;
class Date
{
public:// void Init(Date* const this, int year, int month, int day)void Init(int year, int month, int day){// 編譯報錯:error C2106: “=”: 左操作數必須為左值 // this = nullptr;// this->_year = year;_year = year;this->_month = month;this->_day = day;}void Print()
{cout << _year << "/" << _month << "/" << _day << endl;}
private:// 這?只是聲明,沒有開空間 int _year;int _month;int _day;
};
int main()
{// Date類實例化出對象d1和d2 Date d1;Date d2;// d1.Init(&d1, 2024, 3, 31);d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

我們可以看到d1和d2都是同樣的參數,那么類是怎么區分d1和d2的呢,這就因為其中存在一個隱形指針this

?如Date類的Init的真實原型為

 void Init(Date* const this, int year, int month, int day)

C++規定不能在實參和形參的位置顯?的寫this指針(編譯時編譯器會處理),但是可以在函數體內顯 ?使?this指針。

能夠準精確的分辨d1和d2就是因為有this指針

2.1this指針示例?

讓我們看看下列題目

1.下?程序編譯運?結果是()

?A、編譯報錯?B、運?崩潰?C、正常運?

#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << "A::Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

答案是C正常運行

在看看下面這題

#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << "A::Print()" << endl;cout << _a << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

答案是B運行錯誤,這是為什么呢?

原因就在于

下面的代碼比上面的代碼多了一行

cout << _a << endl

其中涉及了成員_a,所以這里進行訪問時對空指針進行了解引用,因此報錯。

本次的分享就到這里結束,后續會繼續分享,感謝閱讀!

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

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

相關文章

Transformer架構詳解:從Attention到ChatGPT

Transformer架構詳解&#xff1a;從Attention到ChatGPT 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 Transformer架構詳解&#xff1a;從Attention到ChatGPT摘要引言一、Attention機制&#xff1a;Transformer的…

Rock9.x(Linux)安裝Redis7

&#x1f49a;提醒&#xff1a;1&#xff09;注意權限問題 &#x1f49a; 查是否已經安裝了gcc gcc 是C語言編譯器&#xff0c;Redis是用C語言開發的&#xff0c;我們需要編譯它。 gcc --version如果沒有安裝gcc&#xff0c;那么我們手動安裝 安裝GCC sudo dnf -y install…

EasyExcel使用導出模版后設置 CellStyle失效問題解決

EasyExcel使用導出模版后在CellWriteHandler的afterCellDispose方法設置 CellStyle失效問題解決方法 問題描述&#xff1a;excel 模版塞入數據后&#xff0c;需要設置單元格的個性化設置時失效&#xff0c;本文以設置數據格式為例&#xff08;設置列的數據展示時需要加上千分位…

【Day41】

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 →…

Express教程【002】:Express監聽GET和POST請求

文章目錄 2、監聽post和get請求2.1 監聽GET請求2.2 監聽POST請求 2、監聽post和get請求 創建02-app.js文件。 2.1 監聽GET請求 1??通過app.get()方法&#xff0c;可以監聽客戶端的GET請求&#xff0c;具體的語法格式如下&#xff1a; // 1、導入express const express req…

C# 文件 I/O 操作詳解:從基礎到高級應用

在軟件開發中&#xff0c;文件操作&#xff08;I/O&#xff09;是一項基本且重要的功能。無論是讀取配置文件、存儲用戶數據&#xff0c;還是處理日志文件&#xff0c;C# 都提供了豐富的 API 來高效地進行文件讀寫操作。本文將全面介紹 C# 中的文件 I/O 操作&#xff0c;涵蓋基…

Vue-Router簡版手寫實現

1. 路由庫工程設計 首先&#xff0c;我們需要創建幾個核心文件來組織我們的路由庫&#xff1a; src/router/index.tsRouterView.tsRouterLink.tsuseRouter.tsinjectionsymbols.tshistory.ts 2. injectionSymbols.ts 定義一些注入符號來在應用中共享狀態&#xff1a; import…

Electron-vite【實戰】MD 編輯器 -- 文件列表(含右鍵快捷菜單,重命名文件,刪除本地文件,打開本地目錄等)

最終效果 頁面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…

Remote Sensing投稿記錄(投稿郵箱寫錯、申請大修延期...)風雨波折投稿路

歷時近一個半月&#xff0c;我中啦&#xff01; RS是中科院二區&#xff0c;2023-2024影響因子4.2&#xff0c;五年影響因子4.9。 投稿前特意查了下預警&#xff0c;發現近五年都不在預警名單中&#xff0c;甚至最新中科院SCI分區&#xff08;2025年3月&#xff09;在各小類上…

吉林第三屆全國龍舟邀請賽(大安站)激情開賽

龍舟競渡處,瑞氣滿湖光。5月31日&#xff0c;金蛇獻瑞龍舞九州2025年全國龍舟大聯動-中國吉林第三屆全國龍舟邀請賽(大安站)“嫩江灣杯”白城市全民健身龍舟賽在吉林大安嫩江灣國家5A級旅游區玉龍湖拉開帷幕。 上午9時&#xff0c;伴隨著激昂的音樂&#xff0c;活力四射的青春舞…

華為OD機試真題——通過軟盤拷貝文件(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《通過…

一起學數據結構和算法(二)| 數組(線性結構)

數組&#xff08;Array&#xff09; 數組是最基礎的數據結構&#xff0c;在內存中連續存儲&#xff0c;支持隨機訪問。適用于需要頻繁按索引訪問元素的場景。 簡介 數組是一種線性結構&#xff0c;將相同類型的元素存儲在連續的內存空間中。每個元素通過其索引值&#xff08;數…

ZYNQ sdk lwip配置UDP組播收發數據

?? 一、顛覆認知:組播 vs 單播 vs 廣播 通信方式目標設備網絡負載典型應用場景單播1對1O(n)SSH遠程登錄廣播1對全網O(1)ARP地址解析組播1對N組O(1)視頻會議/物聯網群控創新價值:在智能工廠中,ZYNQ通過組播同時控制100臺AGV小車,比傳統單播方案降低92%網絡流量! ?? 二、…

機器學習:欠擬合、過擬合、正則化

本文目錄&#xff1a; 一、欠擬合二、過擬合三、擬合問題原因及解決辦法四、正則化&#xff1a;盡量減少高次冪特征的影響&#xff08;一&#xff09;L1正則化&#xff08;二&#xff09;L2正則化&#xff08;三&#xff09;L1正則化與L2正則化的對比 五、正好擬合代碼&#xf…

Linux命令之ausearch命令

一、命令簡介 ausearch 是 Linux 審計系統 (auditd) 中的一個實用工具,用于搜索審計日志中的事件。它是審計框架的重要組成部分,可以幫助系統管理員分析系統活動和安全事件。 二、使用示例 1、安裝ausearch命令 Ubuntu系統安裝ausearch命令,安裝后啟動服務。 root@testser…

mac電腦安裝nvm

方案一、常規安裝 下載安裝腳本&#xff1a;在終端中執行以下命令來下載并運行 NVM 的安裝腳本3&#xff1a; bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置環境變量&#xff1a;安裝完成后&#xff0c;需要配置環境變量。如…

Excel 操作 轉圖片,轉pdf等

方式一 spire.xls.free&#xff08;沒找設置分辨率的方法&#xff09; macOs開發Java GUI程序提示缺少字體問題解決 Spire.XLS&#xff1a;一款Excel處理神器_spire.xls免費版和收費版的區別-CSDN博客 官方文檔 Spire.XLS for Java 中文教程 <dependency><groupI…

oracle goldengate實現遠程抽取postgresql 到 postgresql的實時同步【絕對無坑版,親測流程驗證】

oracle goldengate實現postgresql 到 postgresql的實時同步 源端&#xff1a;postgresql1 -> postgresql2 流復制主備同步 目標端&#xff1a;postgresql 數據庫版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架構圖&#xff1a; 數據庫安裝以及流復制主備…

2.從0開始搭建vue項目(node.js,vue3,Ts,ES6)

從“0到跑起來一個 Vue 項目”&#xff0c;重點是各個工具之間的關聯關系、職責邊界和技術演化脈絡。 從你寫代碼 → 到代碼能跑起來 → 再到代碼可以部署上線&#xff0c;每一步都有不同的工具參與。 &#x1f63a;&#x1f63a;1. 安裝 Node.js —— 萬事的根基 Node.js 是…

MQTT的Thingsboards的使用

訪問云服務 https://thingsboard.cloud/ 新建一個設備 彈出 默認是mosquittor的客戶端。 curl -v -X POST http://thingsboard.cloud/api/v1/tnPrO76AxF3TAyOblf9x/telemetry --header Content-Type:application/json --data "{temperature:25}" 換成MQTTX的客戶…