c++類和對象(下篇)上

? ? ? ? 今天又重新回到c++的學習中~在前兩篇博客中,我簡單的學習了類的定義,實例化,以及類中的默認成員函數.下篇是類和對象的收尾篇,在這篇中我將補充一下中篇所講的構造函數以及介紹一些類和對象的新知識.下面讓我們開始學習吧.

再談構造函數

? ? ? ? 在之前我們實現構造函數時,初始化成員變量主要用函數體內的賦值,但是構造函數還可以用初始化列表進行成員變量的初始化,(并且最好以后都用初始化列表).初始化列表使用方式為以一個冒號開始,以逗號分隔的數據成員列表,每個成員變量后跟一個放在括號中的初始值或表達式(可以寫在一行,但推薦每個成員獨占一行).

? ? ? ? 每個成員變量在初始化列表中只能出現一次,初始化列表是每個成員變量定義初始化的地方.

? ? ? ? 引用成員變量,const修飾的成員變量,沒有默認構造的類類型變量必須在初始化列表處進行初始化,否則會編譯報錯.

????????c++11支持在成員變量的聲明處給缺省值.這個初始值會給到初始化列表,用于給沒有在初始化列表中顯示初始化的成員初始化.如果在初始化列表中顯示初始化了缺省值就沒用了.

????????盡量使?初始化列表初始化,因為那些你不在初始化列表初始化的成員也會?初始化列表,如果這個成員在聲明位置給了缺省值,初始化列表會?這個缺省值初始化。如果你沒有給缺值,對于沒有顯?在初始化列表初始化的內置類型成員是否初始化取決于編譯器,C++并沒有規定。對于沒有顯?在初始化列表初始化的自定義類型成員調用這個成員類型的默認構造函數,如果沒有默認構造會編譯錯誤

????????初始化列表中按照成員變量在類中聲明順序進行初始化,跟成員在初始化列表出現的的先后順序?關。(建議類的成員變量的聲明順序和初始化列表順序保持?致).

? ? ? ? 注:?論是否顯?寫初始化列表,每個構造函數都有初始化列表.

? ? ? ? ? ? ??論是否在初始化列表顯示初始化成員變量,每個成員變量都要?初始化列表初始化.

? ? ? ? 下表為上面內容的大體總結:

? ? ? ? 下面為一些對應代碼:

//簡單的實驗初始化列表
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;class Date
{
public://錯誤示范//Date(int year , int month , int day )//	:_year(2025)//	, _month(3)//	, _day(13)//{////}//正確做法Date(int year=2025, int month=3, int day=13):_year(year),_month(month),_day(day){}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//錯誤示范對應的測試//Date d1;//會報錯,不要將初始畫列表與函數的缺省值弄混了//這里沒有缺省值,必須要寫實參,如下//Date d1(2222, 2, 2);//d1.Print();//調用之后發現無論給什么值去初始化最后都會打印初始化列表對應的日期Date d1;d1.Print();Date d2(2024,3,14);d2.Print();return 0;
}
class Time
{
public:Time(int hour):_hour(hour){cout << "Time(int hour)" << endl;}
private:int _hour;
};
class Date
{
public:Date(int year = 2025, int month = 3, int day = 13):_year(year), _month(month), _day(day),_a(_day),_b((int*)malloc(sizeof(int)*4))//可以用表達式來初始化, _t1(10){//錯誤示范// 引用成員變量,const修飾的成員變量,沒有默認構造的類類型變量// 必須在初始化列表處進行初始化,否則會編譯報錯.//a = _day;//b = 2;//t1(1);}void Print(){cout << _year << " " << _month << " " << _day << endl;cout << _a << " " << _b << " " << endl;}
private:int _year;int _month;int _day;int& _a;const int* _b;Time _t1;
};
// class Time
//{
//public:
//	Time(int hour)
//		:_hour(hour)
//	{
//		cout << "Time(int hour)" << endl;
//	}
//private:
//	int _hour;
//};
//class Date
//{
//public:
//	Date(int year = 2025, int month = 3, int day = 13)
//		:_a(_day)
//		, _b((int*)malloc(sizeof(int) * 4))//可以用表達式來初始化
//		, _t1(10)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//		//也可以混著用
//	}
//	void Print()
//	{
//		cout << _year << " " << _month << " " << _day << endl;
//		cout << _a << " " << _b << " " << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//
//	int& _a;
//	const int* _b;
//	Time _t1;
//};int main()
{Date d1;d1.Print();return 0;
}
class Date
{
public:Date(int year = 2025, int month = 3, int day = 13){}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private://可以在聲明時給缺省值,作用在初始化列表上int _year=2024;int _month=5;int _day=21;
};int main()
{Date d1;d1.Print();return 0;

? ? ? ? 上面這個程序輸出見上.因為_a1,_a2在初始化列表上都顯示初始化了,所以下面的缺省值就沒有用了.又因為初始化列表中按照成員變量在類中聲明順序進行初始化,所以輸出值為1,隨機值.

類型轉換

? ? ? ? c++支持內置類型隱式轉化為類類型的對象,但需要有相關內置類型為參數的構造函數.

????????構造函數前?加explicit就不再?持隱式類型轉換.

????????類類型的對象之間也可以隱式轉換,需要相應的構造函數?持.

? ? ? ? 下面為一些代碼:

class A
{
public://explicit A(int a = 1)//	:_a1(a)//{//	cout << "A(int a)" << endl;//}//加了explicit之后就禁止隱式轉換了A(int a = 1):_a1(a){cout << "A(int a)" << endl;}A(int a, int b):_a1(a), _a2(b){cout << "A(int a, int b)" << endl;}int Geta1()const//因為下面為只讀引用,所以這里要加const修飾*this{return _a1;}
private:int _a1 = 1;int _a2 = 1;
};class B
{
public:B(const A& a)//這里用const修飾了,a就只讀了所以*this也要只讀(205行):_b(a.Geta1()){cout << "B(const A& a)" << endl;}
private:int _b = 1;
};int main()
{A aa1 = 2;//隱式類型轉換+拷貝構造A aa2 = { 3,4 };//隱式類型轉換+拷貝構造B bb = aa1;//隱式類型轉換+拷貝構造return 0;
}

static成員

?????????static修飾的成員變量,稱之為靜態成員變量靜態成員變量?定要在類外進行初始化.靜態成員變量為所有類對象所共享,不屬于某個具體的對象,不存在對象中,存放在靜態區.?

????????靜態成員變量不能在聲明位置給缺省值初始化,因為缺省值是個構造函數初始化列表的,靜態成員變量不屬于某個對象,不走構造函數初始化列表.靜態成員變量第一次創建(在內存中開空間)是在他第一次使用的時候.

?????????static修飾的成員函數,稱之為靜態成員函數靜態成員函數沒有this指針.靜態成員函數中可以訪問其他的靜態成員,但是不能訪問類中非靜態的,因為沒有this指針(靜態成員函數一般用于取得靜態成員變量).但是非靜態的成員函數,可以訪問任意的靜態成員變量和靜態成員函數.

????????突破類域就可以訪問靜態成員,可以通過類名::靜態成員或者對象.靜態成員來訪問靜態成員變量 和靜態成員函數.(在全局中可以通過上兩種方式來初始化私有的靜態成員變量).靜態成員也是類的成員,受public、protected、private 訪問限定符的限制.(若在類中設置成私有那么就不可以在main函數中突破類域直接訪問).

練習:實現?個類,計算程序中創建出了多少個類對象?

class A
{
public:A(int n = 0):_aa(n){++_a;}//~A()//{//	--_a;//}static int Get_a(){return _a;}
private:int _aa;static int _a;
};int A::_a = 0;
void func()
{A a4;
}
int main()
{A a1;A a2;A a3;func();cout << a1.Get_a() << endl;cout << A::Get_a() << endl;//也可以通過類來調用靜態成員變量return 0;
}

? ? ? ? 好啦,今天的學習就到這里啦,在下一篇博客會把類和對象的最后一點東西寫完,那我們下篇博客見.晚安~

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

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

相關文章

深度學習 bert流程

Token IDs 在自然語言處理任務中&#xff0c;特別是使用預訓練模型如BERT時&#xff0c;文本首先通過一個分詞器&#xff08;例如 BertTokenizer&#xff09;轉換為一系列的token IDs。這些ID是每個詞或子詞單元在詞匯表&#xff08;包含漢字、英文單詞、標點符號&#xff09;…

PPT內視頻播放無法播放的原因及解決辦法

PPT內視頻無法播放&#xff0c;通常是視頻編解碼的問題。目前我遇到的常見的視頻編碼格式有H.264&#xff0c;H.265&#xff0c;VP9&#xff0c;AV1這4種。H.264編解碼的視頻&#xff0c;Windows原生系統可以直接播放&#xff0c;其他的視頻編碼格式需要安裝對應的視頻編解碼插…

星越L_行李艙空間拓展講解

目錄 1.儲物槽 2.底板蓋儲物空間 3.掛鉤 3.左側照明燈 4.第二排座椅放倒 1.儲物槽 使用鑰匙或者后備箱按鈕打開電動后備箱,左側儲物槽可儲藏物品。 2.底板蓋儲物空間 打開地板蓋,下方有儲物空間。并放置了隨車工具。 3.掛鉤 后備箱左右兩測各有一個掛鉤。

深度學習與大模型-矩陣

矩陣其實在我們的生活中也有很多應用&#xff0c;只是我們沒注意罷了。 1. 矩陣是什么&#xff1f; 簡單來說&#xff0c;矩陣就是一個長方形的數字表格。比如你有一個2行3列的矩陣&#xff0c;可以寫成這樣&#xff1a; 這個矩陣有2行3列&#xff0c;每個數字都有一個位置&a…

LuaJIT 學習(2)—— 使用 FFI 庫的幾個例子

文章目錄 介紹Motivating Example: Calling External C Functions例子&#xff1a;Lua 中調用 C 函數 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子&#xf…

基于 FastText、dlib 和 CppJieba 的中文語義相似度計算實踐

在自然語言處理(NLP)領域,語義相似度計算是許多任務的核心,例如問答系統、文本檢索和推薦系統。然而,中文因缺乏顯式分詞和復雜的語義結構,實現高效的語義對比具有一定挑戰性。 本文將介紹如何結合 CppJieba(高效中文分詞工具)、FastText(詞向量模型)和 dlib(機器學…

HCIA-11.以太網鏈路聚合與交換機堆疊、集群

鏈路聚合背景 拓撲組網時為了高可用&#xff0c;需要網絡的冗余備份。但增加冗余容易后會出現環路&#xff0c;所以我們部署了STP協議來破除環路。 但是&#xff0c;根據實際業務的需要&#xff0c;為網絡不停的增加冗余是現實需要的一部分。 那么&#xff0c;為了讓網絡冗余…

Unity基于C#+UGUI解決方案,制作每日簽到系統(本地存儲簽到數據)

一、需求介紹:基于本地存儲系統制作一個每日簽到系統界面,相關簽到界面如下圖所示,點擊“簽到有禮”按鈕后就會跳轉到“每日登錄禮”這個界面,點擊“立即簽到”按鈕之后,按鈕就會置灰,而且按鈕的文字會變成“等待明日”。 二、制作界面顯示相關功能,需要在Unity中新建一…

AI本地部署

文檔加載&#xff08;Document Loading&#xff09;&#xff1a;從多種不同來源加載文檔。LangChain提供了100多種不同的文檔加載器&#xff0c;包括PDF在內的非結構化的數據、SQL在內的結構化的數據&#xff0c;以及Python、Java之類的代碼等? ?文本分割&#xff08;Splitti…

精準車型識別:視覺分析技術的力量

隨著智慧城市和智能交通系統的快速發展&#xff0c;車型識別檢測成為交通管理、安全監控和數據分析的關鍵技術之一。利用視覺分析的方式&#xff0c;我們可以高效、準確地檢測監控下的車輛類型、車牌信息及車流量&#xff0c;為城市交通管理提供有力支持。本文將從背景、技術實…

上下文微調(Contextual Fine-Tuning, CFT)提高大型語言模型(LLMs)在特定領域的學習和推理能力

大型語言模型(LLMs)在開放領域任務中表現出色,但在快速演變的專業領域(如醫學、金融)中面臨挑戰: 知識更新難題:傳統指令微調(Instruction Fine-Tuning, IFT)依賴顯式指令,難以適應動態知識。災難性遺忘:持續預訓練(Continued Pretraining, CPT)可能導致模型遺忘已…

在 LaTeX 中強制表格位于頁面頂部

在 LaTeX 中強制表格位于頁面頂部&#xff0c;可以通過以下 多種方法結合使用&#xff0c;按優先級推薦&#xff1a; 方法 1&#xff1a;使用 [!t] 位置限定符 原理&#xff1a;通過 [!t] 強制 LaTeX 優先將表格放置在頁面頂部&#xff08;Top&#xff09;&#xff0c;! 表示忽…

kotlin與MVVM的結合使用總結(二)

在 MVVM&#xff08;Model - View - ViewModel&#xff09;架構中&#xff0c;M 層即 Model 層&#xff0c;主要負責數據的管理、存儲和獲取&#xff0c;它與業務邏輯和數據處理相關。在 Kotlin 中實現 MVVM 的 M 層&#xff0c;通常會涉及數據類的定義、數據的本地存儲與遠程獲…

電子元器件選型與實戰應用—16 怎么選一個合適的MCU芯片?

文章目錄 1. 選型要素1.1 價格1.2 技術支持1.3 廠家優勢1.4 功耗1.5 特殊功能1.6 統計外設1.7 確定外設占用的內存和flash大小1.8 確定外設通信接口1.9 確定外設通信接口的電平1.10 確定外設的GPIO數量1.11 確定外設的供電和功耗1.12 確定外設GPIO的種類1.13 確定ADC的數量1.14…

VSCode 搭建C++編程環境 2025新版圖文安裝教程(100%搭建成功,VSCode安裝+C++環境搭建+運行測試+背景圖設置)

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、VScode下載及安裝二、安裝 MinGW-w64 工具鏈三、Windows環境變量配置四、檢查 M…

Django系列教程(7)——路由配置URLConf

目錄 URLconf是如何工作的? path和re_path方法 更多URL配置示例 URL的命名及reverse()方法 使用命名URL 硬編碼URL - 不建議 URL指向基于類的視圖(View) 通過URL傳遞額外的參數 小結 Django的項目文件夾和每個應用(app)目錄下都有urls.py文件&#xff0c;它們構成了D…

transformer bert 多頭自注意力

輸入的&#xff08;a1,a2,a3,a4&#xff09;是最終嵌入&#xff0c;是一個(512,768)的矩陣&#xff1b;而a1是一個token&#xff0c;尺寸是768 a1通過wq權重矩陣&#xff0c;經過全連接變換得到查詢向量q1&#xff1b;a2通過Wk權重矩陣得到鍵向量k2&#xff1b;q和k點乘就是值…

Spring Boot + MyBatis-Plus 項目目錄結構

以下是一個標準的 Spring Boot MyBatis-Plus 項目目錄結構及文件命名規范&#xff0c;包含每個目錄和文件的作用說明&#xff0c;適用于中大型項目開發&#xff1a; 項目根目錄結構 src/ ├── main/ │ ├── java/ # Java 源代碼 │ │ └── com/…

Webpack優化前端性能

Webpack優化前端性能☆☆ 涵蓋了代碼分割、懶加載、壓縮、緩存優化、Tree Shaking、圖片優化、CDN使用等多個方面。 Webpack優化前端性能詳解(2025綜合實踐版) Webpack作為現代前端工程化的核心工具,其優化能力直接影響項目的首屏速度、交互流暢度和用戶體驗。以下從代碼維…

ardunio R4 WiFi連接實戰

ardunio WiFi連接模板 ardunio R4 WiFi 開發板有著不錯的性能和板載內存&#xff0c;本機自帶 WiFi 連接模塊&#xff0c;可以完成簡單的網絡服務。對于這個小東西我情有獨鐘&#xff0c;也總希望能夠用它來做些什么&#xff0c;所以先從 WiFi 連接開始學起&#xff0c;未來考…