【C++初階】—— 類和對象 (上)

📝個人主頁🌹:EterNity_TiMe_
?收錄專欄?:C++ “ 登神長階 ”
🌹🌹期待您的關注 🌹🌹

在這里插入圖片描述

在這里插入圖片描述

類和對象

  • 1. 初步認識C++
  • 2. 類的引入
  • 3. 類的定義
    • 聲明和定義全部放在類體中
    • 聲明和定義分開存放
  • 4. 類的訪問限定符
  • 5. 類的實例化
  • 6. 類對象模型
    • 如何計算類對象的大小
    • 類對象的存儲方式
  • 7. this指針
    • this指針的特性
  • 8. 總結


前言:在前面幾節我們為正式進入C++做足了鋪墊,現在我們有了足夠的基礎讓我們進入C++,讓我們來進入類和對象來真正了解C++!

本篇主要內容:
類的相關知識
this指針


1. 初步認識C++

1. 我們知道之前學習的C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數調用逐步解決問題。

2. C++是基于面向對象的,關注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成

舉個例子,就像我們洗衣服,在C語言中我們需要一步一步按過程操作來手洗,而C++則是有了很多對象,對象間相互交互來完成洗衣服!
在這里插入圖片描述

在這里插入圖片描述


2. 類的引入

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

struct pxt
{char b[100] = { "hello world!" };int a = 2024;void test(){cout << "hello world!" << endl;}};
int main()
{pxt xyyj;xyyj.test();cout << xyyj.b << endl;return 0;
}

在這里插入圖片描述

上面結構體的定義就是類,但在C++中更喜歡用class來代替


3. 類的定義

// C++中更喜歡用class
class className
{// 類體:由成員函數和成員變量組成
};  
// 一定要注意后面的分號
  • class為定義類的關鍵字,className為類的名字,{}中為類的主體,注意類定義結束時后面分號不能省略
  • 類體中內容稱為類的成員:類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或者成員函數

類的兩種定義方式:

  • 聲明和定義全部放在類體中
  • 聲明和定義分開存放

聲明和定義全部放在類體中

class pxt
{int a = 2024;char b[100] = { "hello world!" };int c = 666;void test(){cout << b << " " << a << " " << c << endl;}
};
int main()
{pxt xyyj;xyyj.test();return 0;
}

注意: 成員函數如果在類中定義,編譯器可能會將其當成內聯函數處理。

聲明和定義分開存放

// func.h
class pxt
{int a = 2024;char b[100] = { "hello world!" };int c = 666;void test();
};
// func.cpp
void test()
{cout << b << " " << a << " " << c << endl;
}
// test.c
int main()
{pxt xyyj;xyyj.test();return 0;
}

如果這樣聲明和定義那么將無法完成編譯!
在這里插入圖片描述
test在func.cpp中找不到pxt類中的成員變量

// 因此我們應該指明在pxt中尋找,否則可能以為定義一個新函數
void pxt::test()
{cout << b << " " << a << " " << c << endl;
}

4. 類的訪問限定符

在這里插入圖片描述

訪問限定符說明:

  • public修飾的成員在類外可以直接被訪問
  • protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
  • 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止
  • 如果后面沒有訪問限定符,作用域就到最后即類結束。
  • class的默認訪問權限為private,struct為public(因為struct要兼容C)
class pxt
{
public:void test(){cout << b << " " << a << " " << c << endl;}
private:int a;char b[100] = { "hello world!" };int c;
};
int main()
{pxt xyyj;xyyj.test();//cout << xyyj.b << endl; // 無法運行//cout << xyyj.a << endl; // 無法運行return 0;
}

public修飾的成員是共有的,類外可以訪問
private修飾的的成員是私有的類外不能訪問

注意:成員函數不管成員變量是私有還是公有,它都能直接訪問,因為它們都屬于這個類


5. 類的實例化

用類類型創建對象的過程,稱為類的實例化

  • 類是對對象進行描述的,定義出一個類并沒有分配實際的內存空間來存儲它
  • 實例化出的對象 占用實際的物理空間,存儲類成員變量
// 在沒有實例化之前并不會占用實際物理空間
class pxt
{
public:......
private:int a;
};

類實例化出對象就像現實中使用建筑設計圖建造出房子,類就像是設計圖
在這里插入圖片描述
在這里插入圖片描述


6. 類對象模型

如何計算類對象的大小

class pxt
{
public:void test(){cout << b << " " << a << endl;}
private:int a;char b;
};
class xyyj
{
public:int a;char b;
};
int main()
{cout << "pxt -> sizeof: " << sizeof(pxt) << endl;cout << "xyyj -> sizeof: " << sizeof(xyyj) << endl;return 0;
}

在學C語言結構體的時候我們講過結構體內存對齊規則,那么C++中多了個函數該怎么計算呢,我們先來看看結果
在這里插入圖片描述

初步結論:

  • 類的成員函數不算在類的大小中
  • 類的大小遵守結構體內存對齊規則

類對象的存儲方式

好家伙,兩個類結果居然是一樣的,這到底是什么情況?為啥類中的成員函數不占空間?

這其實和類對象的存儲方式有關——只保存成員變量,成員函數存放在公共的代碼段

在這里插入圖片描述
每個對象雖然實例化的值不一樣,但是調用的函數是相同的,將函數單獨放在一個區域能節省空間

綜上所述:

  • 類的成員函數不算在類的大小中
  • 類的大小遵守結構體內存對齊規則
  • 空類的大小是一個字節,用來唯一標識這個類的對象

忘了結構體內存對齊的可以復習一下:
結構體內存對齊


7. 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(2024, 5, 20);d2.Init(2024, 5, 21);d1.Print();d2.Print();return 0;
}

那么Date類中有 Init 與 Print 兩個成員函數,函數體中沒有關于不同對象的區分,那當d1調用 Init 函數時,該函數是如何知道應該設置d1對象,而不是設置d2對象呢?

  • C++編譯器給每個“非靜態的成員函數“增加了一個隱藏的指針參數,讓該指針指向當前對象(調用該函數的對象),在函數體中所有“成員變量”的操作,都是通過該指針去訪問

this指針的特性

this指針的特性:

  • this指針的類型:類類型* const,即成員函數中,不能給this指針賦值。
  • 只能在“成員函數”的內部使用
  • this指針本質上是“成員函數”的形參,當對象調用成員函數時,將對象地址作為實參傳遞給this形參。所以對象中不存儲this指針。
  • this指針是“成員函數”第一個隱含的指針形參,不需要用戶傳遞

在這里插入圖片描述
雖然我們知道成員函數中存在this指針,但是我們傳參不能傳this指針

public:// 絕對不能這么定義void Init(Date*this, int year, int month, int day){_year = year;_month = month;_day = day;} // false

使用this指針將對象的地址傳入函數中函數體就可以區分不同對象了


8. 總結

本章是類和對象的第一課,我們簡單了解了類的基本概念和特性和this指針,this指針對后面用處很大,類在C++是很重要的希望大家能打好基礎!

謝謝大家支持本篇到這里就結束了
在這里插入圖片描述

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

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

相關文章

8個實用網站和軟件,收藏起來一定不后悔~

整理了8個日常生活中經常能用得到的網站和軟件&#xff0c;收藏起來一定不會后悔~ 1.ZLibrary zh.zlibrary-be.se/這個網站收錄了超千萬的書籍和文章資源&#xff0c;國內外的各種電子書資源都可以在這里搜索&#xff0c;98%以上都可以在網站內找到&#xff0c;并且支持免費下…

Android系統的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;環境的啟動腳本。mksh 是 Android 默認使用的 shell&#xff0c;在 shell 啟動時會讀取并執行這個文件中的配置。以下是關于 /etc/mkshrc 文件的詳細信息及其用途。 /etc/mkshrc 文件的作用 環境配…

sql server專題實驗4 復雜查詢

SQL Server 是微軟開發的數據庫管理系統&#xff0c;它支持復雜的查詢操作&#xff0c;允許用戶從數據庫中檢索、分析和處理數據。在進行復雜查詢時&#xff0c;通常會用到以下幾種SQL語句和概念&#xff1a; 連接&#xff08;Join&#xff09;: INNER JOIN&#xff1a;只返回兩…

設計模式--備忘錄模式

備忘錄模式是一種行為設計模式&#xff0c;它用于在不破壞封裝的前提下&#xff0c;保存一個對象的內部狀態&#xff0c;以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用&#xff0c;例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。 備忘…

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法&#xff1a; ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法&#xff1a; ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題&#xff0c;通常需要確保網站或服務使用HTTPS協議進行加密通信&#xff0c;可以通過部署SSL證書來解決&#xff0c;以下是具體的解決步驟&#xff1a; 1 申請IP地址SSL證書&#xff1a;網站管理員應向證書頒發機構&#xff08;CA&#xff09;申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務&#xff08;默認站點&#xff09;PC機訪問網頁 配置IIS服務&#xff08;新建站點&#xff09;PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP&#xff1a;192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號&#xff0c;從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一&#xff0c;對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺&#xff0c;我們能夠聽到他人的語言…

安裝錯誤提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打開autoremove&#xff0c;系統檢查&#xff0c;點擊開始檢查。檢查完成修復。 可以解決部分該問題&#xff0c;如果沒解決的請咨詢

Linux中的文件描述符

1.系統調用接口和庫函數的關系 函數&#xff1a;fopen fclose fread fwrite 都是c標準庫當中的函數&#xff0c;也就是用戶操作接口中ibc系統調用&#xff1a;open close read write 都是系統調用提供的接口 c語言中接口底層封裝的都是系統調用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(樹形dp)

[ P O I 2008 ] S T A ? S t a t i o n ( 樹形 d p ) \Huge{[POI2008] STA-Station(樹形dp)} [POI2008]STA?Station(樹形dp) 題目鏈接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目錄 題意思路標程 題意 給定一個 n n n個點的樹&#xff0c;請求出一個結點&#…

js無感刪除url搜索部分,不刷新頁面

如&#xff1a;把下面的網址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 網站標題, location.origin)

TikTok越獄檢測之二 <調試器檢測>

來了&#xff0c;調試器檢測。總結如下,多多指教: 檢測app 是否被附加調試: 原理就是檢測父進程是否 launchd啟動&#xff0c;在OS X和iOS 系統中&#xff0c;用戶環境始于launchd&#xff0c;為用戶態出現的第一個進程&#xff0c;為所有的進程的祖先&#xff0c;launchd 的進…

Python模塊、包和異常處理

大家好&#xff0c;在當今軟件開發領域&#xff0c;Python作為一種簡潔、易讀且功能強大的編程語言&#xff0c;被廣泛應用于各種領域。作為一名測試開發工程師&#xff0c;熟練掌握Python的模塊、包和異常處理是提高代碼可維護性和錯誤處理能力的關鍵。本文將和大家一起探討Py…

SAP-MRP和采購申請

1、如果采購申請是手工創建的,跑MRP會不會被覆蓋? 創建一個采購申請18089476,然后運行MRP-MD03,再用MD04查看下 從上圖看,手工創建的采購申請被打上*號,沒有被覆蓋掉。 2、如果采購申請被審批了,會不會被覆蓋掉? 首先創建一個獨立需求MD61 然后庫存消耗掉為0,運行M…

shell實現ssh服務防止暴力破解 —— 筑夢之路

實現原理 對系統登陸日志文件/var/log/secure&#xff0c;進行數據篩選&#xff0c;查找登陸失敗的ip地址&#xff0c;然后將ip加入到黑名單中。 腳本內容 #!/bin/bash# 獲取登陸失敗的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …

普源精電收購耐數電子——用“鈔能力”拿下“量子”?

「量子市界」聚焦量子前沿&#xff0c;揭秘市場動態┃2024年4月30日&#xff0c;普源精電新增“量子科技”概念。 似乎一夜之間&#xff0c;新增“量子科技”概念的上市企業如雨后春筍般登場——普源精電就是其一。普源精電本就持有耐數電子32.26%股權&#xff0c;于4月2日發布…

c4d云渲染是工程文件會暴露嗎?

在數字創意產業飛速發展的今天&#xff0c;C4D云渲染因其高效便捷而備受歡迎。然而&#xff0c;隨著技術應用的深入&#xff0c;人們開始關注一個核心問題&#xff1a;在享受云渲染帶來的便利的同時&#xff0c;C4D工程文件安全嗎&#xff1f;是否會有暴露的風險&#xff1f;下…

【如何讓論文中摘要后面的內容不出現在目錄中】

首先選擇摘要二字&#xff0c;設置為一級標題&#xff0c;然后選擇摘要后面的內容設置為正文樣式&#xff0c;再選擇這一部分看一下是不是都是正文大綱級別&#xff0c;如果是那就可以了。 具體流程如下 1、選擇摘要二字&#xff0c;設置為一級標題樣式 2、選擇摘要后面的文…

x264 碼率控制原理:rate_estimate_qscale 函數

rate_estimate_qscale 函數 原理 函數功能:根據目前使用的實際比特數更新一幀的qscale;是一個復雜的決策過程,需要考慮多種因素,如幀類型、編碼的復雜度、目標比特率、緩沖區大小等,以確保視頻質量和文件大小之間的平衡。函數參數分析:x264_t *h :編碼器上下文信息結構…