c++初階知識——類和對象(1)

目錄

1.類和對象

1.1 類的定義

1.2 訪問限定符

1.3 類域

?2.實例化

2.1 實例化概念

2.2 對象大小?

內存對齊規則?

3.this指針


1.類和對象

1.1 類的定義

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

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Stack
{
public:// 成員函數void Init(int n = 4){array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申請空間失敗");return;}capacity = n;top = 0;}void Push(int x){// ...擴容arr[top++] = x;}int Top(){assert(top > 0);return array[top - 1];}void Destroy(){free(array);array = nullptr;top = capacity = 0;}private:int* arr;int size;int capacity;
};
int main()
{Stack st;st.Init();st.Push(1);st.Push(2);cout << st.Top() << endl;st.Destroy();return 0;}

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

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

(3)C++中struct也可以定義類,C++兼容C中struct的?法,同時struct升級成了類,明顯的變化是struct中可以定義函數,區別是使用struct定義的類的成員默認為public,而class定義的類的成員默認為private(public和private定義后面會講到),?般情況下我們還是推薦?class定義類。

#include<iostream>
using namespace std;
// C++升級struct升級成了類
// 1、類??可以定義函數
// 2、struct名稱就可以代表類型
// C++兼容C中struct的?法
typedef struct ListNodeC
{
struct ListNodeC* next;
int val;
}LTNode;
// 不再需要typedef,ListNodeCPP就可以代表類型
struct ListNodeCPP
{
void Init(int x)
{
next = nullptr;
val = x;
}
ListNodeCPP* next;
int val;
};
int main()
{
return 0;
}

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

1.2 訪問限定符

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

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

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

(4)class定義成員沒有被訪問限定符修飾時默認為privatestruct默認為public

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

【面試題】

問題:C++中struct和class的區別是什么?

解答:C++需要兼容C語言,所以C++中struct可以當成結構體使用。另外C++中struct還可以用來
定義類。和class定義類是一樣的,區別是struct定義的類默認訪問權限是public,class定義的類
默認訪問權限是private。注意:在繼承和模板參數列表位置,struct和class也有區別,后序給大
家介紹。

1.3 類域

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

(2)類域影響的是編譯的查找規則,下?程序中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.實例化

2.1 實例化概念

(1)?類類型在物理內存中創建對象的過程,稱為類實例化出對象。

(2)類是對象進??種抽象描述,是?個模型?樣的東西,限定了類有哪些成員變量,這些成員變量只是聲明,沒有分配空間,?類實例化出對象時,才會分配空間。

(3)?個類可以實例化出多個對象,實例化出的對象 占?實際的物理空間,存儲類成員變量。打個??:類實例化出對象就像現實中使?建筑設計圖建造出房?,類就像是設計圖,設計圖規劃了有多少個房間,房間??功能等,但是并沒有實體的建筑存在,也不能住?,?設計圖修建出房?,房?才能住?。同樣類就像設計圖?樣,不能存儲數據,實例化出的對象分配物理內存存儲數據。

代碼實例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
class Data
{
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和d2Data d1;Data d2;d1.Init(2024, 9,9);d1.print();d2.Init(1919, 5, 4);d2.print();return 0;
}

2.2 對象大小?

? ?分析?下類對象中哪些成員呢?類實例化出的每個對象,都有獨?的數據空間,所以對象中肯定包含成員變量,那么成員函數是否包含呢??先函數被編譯后是?段指令,對象中沒辦法存儲,這些指令存儲在?個單獨的區域(代碼段),那么對象中?要存儲的話,只能是成員函數的指針。

再分析?下,對象中是否有存儲指針的必要呢,Date實例化d1和d2兩個對象,d1和d2都有各?獨?的成員變量_year/_month/_day存儲各?的數據,但是d1和d2的成員函數Init/Print指針卻是?樣的,存儲在對象中就浪費了。

如果?Date實例化100個對象,那么成員函數指針就重復存儲100次,太浪費了。這?需要再額外啰嗦?下,其實函數指針是不需要存儲的,函數指針是?個地址,調?函數被編譯成匯編指令[call 地址], 其實編譯器在編譯鏈接時,就要找到函數的地址,不是在運?時找,只有動態多態是在運?時找,就需要存儲函數地址,這個我們以后會講解

?

上?我們分析了對象中只存儲成員變量,C++規定類實例化的對象也要符合內存對?的規則。

內存對齊規則?

?(1)第?個成員在與結構體偏移量為0的地址處。

(2)其他成員變量要對?到某個數字(對?數)的整數倍的地址處。

(3)注意:對?數 = 編譯器默認的?個對?數 與 該成員??的較?值。

(4)VS中默認的對?數為8

(5)構體總??為:最?對?數(所有變量類型最?者與默認對?參數取最?)的整數倍。

(6)如果嵌套了結構體的情況,嵌套的結構體對?到??的最?對?數的整數倍處,結構體的整體??就是所有最?對?數(含嵌套結構體的對?數)的整數倍。

3.this指針

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

(2)編譯器編譯后,類的成員函數默認都會在形參第?個位置,增加?個當前類類型的指針,叫做this指針。?如Date類的Init的真實原型為:?void Init(Date* const this, int year,int month, int day)

(3)類的成員函數中訪問成員變量,本質都是通過this指針訪問的,如Init函數中給_year賦值:?this->_year = year;

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

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

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

相關文章

達夢數據庫中的線程和進程

達夢數據庫中的線程和進程 在達夢數據庫中&#xff0c;線程和進程的概念與操作系統中的定義類似&#xff0c;但有一些特定的實現細節和用途。以下是達夢數據庫中線程和進程的一些關鍵點&#xff1a; 進程&#xff08;Process&#xff09;&#xff1a; 在達夢數據庫中&#x…

django的增刪改查,排序,分組等常用的ORM操作

Django 的 ORM&#xff08;對象關系映射&#xff09;提供了一種方便的方式來與數據庫進行交互。 1. Django模型 在 myapp/models.py 中定義一個示例模型&#xff1a;python from django.db import modelsclass Person(models.Model):name models.CharField(max_length100)age…

mysql數據庫被偷家,數據全部丟失。還勒索我給他比特幣

歹徒留下的勒索信息。 解決辦法&#xff1a; 1、設置ip白名單&#xff0c; 2、端口不要使用默認端口&#xff0c;隨便換個端口就行。 3、密碼設置復雜一點。

【Java16】多態

向上類型轉換 對于引用變量&#xff0c;在程序中有兩種形態&#xff1a;一種是編譯時類型&#xff0c;這種引用變量的類型在聲明它的時候就決定了&#xff1b;另一種則是運行時類型&#xff0c;這種變量的類型由實際賦給它的對象決定。 當一個引用變量的編譯時類型和運行時類…

【Pytorch】Conda環境pack打包遷移報錯處理

文章目錄 Anaconda虛擬環境打包一、源電腦的環境打包1.安裝conda-pack工具2.確定環境3.打包環境4.將打包環境拷貝到U盤 二、環境遷移到目標電腦上三、異常處理pip install -e. 導致無法pack→忽略管理的文件已經被刪除或者被覆蓋→壓縮成tar注意 重新激活環境 Anaconda虛擬環境…

14 - matlab m_map地學繪圖工具基礎函數 - 一些數據轉換函數(一)

14 - matlab m_map地學繪圖工具基礎函數 - 一些數據轉換函數&#xff08;一&#xff09; 0. 引言1. 關于m_ll2xy和m_xy2ll2. 關于m_lldist3. 關于m_xydist4 關于m_fdist5 關于m_idist6. 總結 0. 引言 通過前面篇節已經將m_map繪圖工具中大多繪圖有關的函數進行過介紹&#xff0…

Nuxt3封裝網絡請求 useFetch $fetch

前言&#xff1a; 剛接觸、搭建Nuxt3項目的過程還是有點懵的&#xff0c;有種摸石頭過河的感覺&#xff0c;對于網絡請求這塊&#xff0c;與之前的Vue3項目有所區別&#xff0c;在Vue項目通常使用axios這個庫進行網絡請求&#xff0c;但在Nuxt項目并不推薦&#xff0c;因為有內…

RK3568平臺(顯示篇)主屏副屏配置

一.主屏副屏配置 目前在RK3568平臺上有兩路HDMIOUT輸出&#xff0c;分別輸出到兩個屏幕上&#xff0c;一路配置為主屏&#xff0c;一路配置為副屏。 硬件原理圖&#xff1a; &hdmi0_in_vp2 {status "okay"; };&hdmi1_in_vp0 {status "okay"; }…

【JAVA入門】Day15 - 接口

【JAVA入門】Day15 - 接口 文章目錄 【JAVA入門】Day15 - 接口一、接口是對“行為”的抽象二、接口的定義和使用三、接口中成員的特點四、接口和類之間的關系五、接口中新增的方法5.1 JDK8開始接口中新增的方法5.1.1 接口中的默認方法5.1.2 接口中的靜態方法 5.2 JDK9 開始接口…

Pandas實戰指南:any()函數深度解析與高效應用

Pandas實戰指南&#xff1a;any()函數深度解析與高效應用 引言 在數據分析和處理過程中&#xff0c;經常需要快速檢查數據集中是否存在滿足特定條件的元素。Pandas庫中的any()函數正是這樣一個強大的工具&#xff0c;它可以幫助我們沿著指定的軸檢查是否至少有一個元素滿足某…

Transformer重要論文與書籍 - Transformer教程

近年來&#xff0c;人工智能領域中的Transformer模型無疑成為了炙手可熱的研究對象。從自然語言處理&#xff08;NLP&#xff09;到計算機視覺&#xff0c;Transformer展現出了前所未有的強大能力。今天&#xff0c;我們將探討Tra在當今的人工智能和機器學習領域&#xff0c;Tr…

路由守衛中使用next()跳轉到指定路徑時會無限循環

路由守衛鉤子介紹 const router new VueRouter({ ... }) // 導航路由變化時觸發路由守衛鉤子 router.beforeEach((to, from, next) > {// ... }) to: Route: 即將要進入的目標路由對象(到哪去)from: Route: 當前導航正要離開的路由(從哪來)next: Function(必須&#xff0…

axios使用sm2加密數據后請求參數多了雙引號解決方法

axios使用sm2加密數據后請求參數多了雙引號解決 背景問題描述解決過程 背景 因項目安全要求&#xff0c;需對傳給后端的入參加密&#xff0c;將請求參數加密后再傳給后端 前期將axios降低到1.6.7后解決了問題&#xff0c;但最近axios有漏洞&#xff0c;安全要求對版本升級&…

從零開始[進階版]深入學習圖像分類:使用Python和TensorFlow

引言 圖像分類是計算機視覺中的一個核心任務&#xff0c;廣泛應用于人臉識別、自動駕駛、醫療影像分析等領域。在本篇文章中&#xff0c;我們將深入探討圖像分類的原理和實現&#xff0c;使用Python和TensorFlow搭建一個完整的圖像分類系統。本文不僅適合初學者&#xff0c;也…

【Qt 初識 Test】用圖形化和代碼的方式實現簡單的Qt程序

文章目錄 1. 通過圖形化的方式實現&#x1f34e;2. 通過代碼的方式實現 1. 通過圖形化的方式實現&#x1f34e; 在界面創建出一個控件&#xff0c;顯示 hello world&#xff0c;通過拖拽的方式實現&#xff1b; widget.ui文件如下&#xff1a;&#x1f50d; 生成的 ui_widget.…

生物環保技術有哪些缺點或者局限性呢

生物環保技術&#xff0c;作為一種利用生物學原理和技術來處理環境污染的方法&#xff0c;雖然具有綠色環保、高效節能等優點&#xff0c;但也存在一些缺點和局限性。以下是對這些缺點和局限性的詳細分析&#xff1a; 一、受環境因素影響大 生物環保技術的效果往往受到環境因…

數據結構第18節 散列表 - 應用

散列表&#xff08;Hash Table&#xff09;&#xff0c;也被稱為哈希表&#xff0c;是一種數據結構&#xff0c;它通過使用哈希函數將鍵映射到數組的某個位置來實現快速查找。散列表通常提供平均時間復雜度為O(1)的查找、插入和刪除操作&#xff0c;這使得它們在處理大量數據時…

【mybatis】mybatisX插件概述

一、主要功能 智能補全與提示 MyBatisX 可以智能地提示和補全 SQL 語句中的關鍵字、表名、列名等信息&#xff0c;從而顯著提高開發效率。代碼生成器 雖然 MyBatisX 本身可能不直接提供一個完整的、獨立的代碼生成器&#xff0c;但它可能集成了或支持與其他代碼生成工具&#…

鹵味江湖中,周黑鴨究竟該抓住什么賽點?

近年來&#xff0c;鹵味江湖的決斗從未停止。 隨著休閑鹵味、佐餐鹵味等細分賽道逐漸形成&#xff0c;“鹵味三巨頭”&#xff08;周黑鴨、絕味食品、煌上煌&#xff09;的牌桌上有了更多新對手&#xff0c;賽道變擠了&#xff0c;“周黑鴨們”也到了轉型關鍵期。 這個夏天&a…

MySQL字符串相關數據處理函數

目錄 1. 轉大小寫 2. 截取字符串 sunstr 3. 獲取字符長度 4. 字符串拼接 concat 5. 去掉空白 trim 1. 轉大小寫 轉大寫&#xff1a;upper() 轉小寫&#xff1a;lower() 雖然MySQL不嚴格區分大小寫&#xff0c;但是我們還是需要掌握這種大小寫的操作以方便學習其他…