C++ 類和對象 構造函數

一 類的6個默認成員函數:

如果一個類中什么成員都沒有,簡稱為空類。

例:

#include <iostream>
class Empty 
{// 空類,什么成員都沒有
};

空類中真的什么都沒有嗎?并不是,任何類在什么都不寫時,編譯器會自動生成以下6個默認成員 函數。

默認構造函數:如果用戶沒有定義任何構造函數,編譯器會自動生成一個默認構造函數。

拷貝構造函數:用于創建一個對象是另一個對象的副本。如果用戶沒有定義,編譯器會生成一個默認的拷貝構造函數。

拷貝賦值運算符:用于將一個對象賦值給另一個對象。如果用戶沒有定義,編譯器會生成一個默認的拷貝賦值運算符。

移動構造函數:用于將資源從一個對象移動到另一個對象。如果用戶沒有定義,編譯器會生成一個默認的移動構造函數。

移動賦值運算符:用于將資源從一個對象移動并賦值給另一個對象。如果用戶沒有定義,編譯器會生成一個默認的移動賦值運算符。

析構函數:用于銷毀對象并釋放資源。如果用戶沒有定義,編譯器會生成一個默認的析構函數。

默認成員函數:用戶沒有顯式實現,編譯器會生成的成員函數稱為默認成員函數。

二 構造函數:

2.1:構造函數的概念:

構造函數是一個特殊的成員函數,它的名稱與類名相同,沒有返回值。在創建類的對象時,構造函數由編譯器自動調用,用于初始化對象的數據成員

2.2:構造函數的特征

函數名與類名相同。

沒有返回值。

在對象實例化時由編譯器自動調用。

構造函數可以重載,即一個類可以有多個構造函數,只要它們的參數列表不同。

2.3:無參/有參構造函數代碼示例

class Date
{
public://有參數的構造函數://Date(int _year = 1999 , int _month = 2 , int _day = 26)// 無參構造函數:Date() //函數名與類名相同。{// 使用 this 指針訪問成員變量this->_year = 2024;this->_month = 7;this->_day = 6;}void Print(){std::cout << this->_year << "-" << this->_month << "-" << this->_day << std::endl;}private:int _year;int _month;int _day;
};int main()
{Date d1; //調用無參數構造函數 d1.Print();//Date d2(2022, 7, 6); //調用帶參構造函數//d2.Print();return 0;
}

Date()是無參的構造函數,沒有參數。在對象 d1 創建時自動調用。你們有可能會問了,為什么在無參的構造函數里面this指針指向成員變量,那為什么main函數里見不到this指針呢?因為當 Date d1; 創建對象時,編譯器會自動傳遞 d1 的地址給 this 指針所以就不需要顯示this指針。

如果類中沒有顯式定義構造函數,編譯器會自動生成一個無參的默認構造函數。一旦用戶顯式定義了任何構造函數,編譯器將不再生成無參的默認構造函數。

2.4:默認構造函數代碼示例

class Date 
{
public:void Print() {std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;int _month;int _day;
};int main() 
{Date d1;d1.Print();return 0;
}

輸出:

上面代碼因我未顯示定義構造函數所以編譯器幫我生成了一個默認的構造函數而且是看不見的,那為什么默認生成的輸出的值是隨機值呢?

原來C++把類型分為內置類型和自定義類型,內置類型就是語言提供的基本數據類型,如intchar等。自定義類型是用戶定義的類型,如使用classstructunion定義的類型。

2.5:內置類型和自定義類型的默認構造函數處理

內置類型:

? ?1.內置類型的成員變量在默認構造函數中不會被自動初始化

? ?2.如果不顯式初始化,成員變量的值將是未定義的(即隨機值)

自定義類型:

? ?1.自定義類型的成員變量在默認構造函數中會調用其默認構造函數。

? ?這意味著,即使你沒有顯式定義自定義類型的構造函數,編譯器也會自動調用默認構造函數來? ? ? ?初始化這些成員變量。

例子:

class Time 
{
public:Time() {// Time類的無參構造函數std::cout << "Time()" << std::endl;_hour = 0;_minute = 0;_second = 0;}private:int _hour;int _minute;int _second;
};class Date 
{
public:Date()// 初始化內置類型成員變量{this->_year = 2024;this->_month = 7;this->_day = 5;}void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;  // 內置類型int _month; // 內置類型int _day;   // 內置類型Time _t;    // 自定義類型
};int main() 
{Date d;  // 調用無參構造函數d.Print();return 0;
}

輸出:

我們來說一下它的執行順序:首先是執行主函數main當執行到?Date d; 時編譯器就會先去調用自定義函數Time_t;然后等它全部初始化完成 再去調用無參數構造并且初始化里面的內置類型。

那我們這是顯式定義自定義類型的構造函數并且給成員變量賦值了,所以就不會出現隨機值,如果想要顯式定義自定義類型的構造函數并且不想要隨機值那該怎么辦呢?這時候C++11 中針對內置類型成員不初始化的缺陷,又打了補丁,即:內置類型成員變量在類中聲明時可以給默認值。

例子:

class Date 
{
public:void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year = 2024;  // 內置類型int _month = 2; // 內置類型int _day = 1;   // 內置類型
};

輸出:

2.6:默認構造函數

在C++中,默認構造函數是指在創建對象時不需要提供任何參數的構造函數。默認構造函數可以分為兩種:

  1. 默認構造函數:一個類只能有一個真正的默認構造函數(不需要參數)。
  2. 無參構造函數和全缺省參數構造函數
    • 如果參數不同,它們會重載,編譯器不會報錯。
    • 如果參數相同(即都沒有參數),它們就相當于有兩個默認構造函數,這時編譯器會報錯,因為無法區分調用哪個構造函數。

關鍵點

無參構造函數:沒有參數的構造函數。 全缺省參數構造函數:所有參數都有默認值的構造函數。 重載:當構造函數的參數列表不同,它們可以共存且不會沖突。

?

例子:

class Date 
{
public:// 無參構造函數Date() {_year = 2024;_month = 7;_day = 2;}// 全缺省參數構造函數Date(int year = 2023, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}void Print(){std::cout << _year << "-" << _month << "-" << _day << std::endl;}private:int _year;int _month;int _day;
};int main() 
{Date d;  // 調用無參構造函數d.Print();Date d2(2023, 4, 3);  // 調用全缺省參數構造函數d2.Print(); return 0;
}

輸出:

之所以會報錯是因為全缺省參數構造函數和無參數構造函數它們都有自己的默認值,當執行到Date d; 時它并不知道到底要調用哪一個所以就會報錯,那怎么更改呢?只需要把全缺省參數的默認值給去掉就行了,這樣編譯器就不會迷糊到底要調用哪一個了

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

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

相關文章

洛谷 P1035 [NOIP2002 普及組] 級數求和

本文由Jzwalliser原創&#xff0c;發布在CSDN平臺上&#xff0c;遵循CC 4.0 BY-SA協議。 因此&#xff0c;若需轉載/引用本文&#xff0c;請注明作者并附原文鏈接&#xff0c;且禁止刪除/修改本段文字。 違者必究&#xff0c;謝謝配合。 個人主頁&#xff1a;blog.csdn.net/jzw…

qt 讀取配置文件

在Qt中讀取配置文件&#xff0c;主要有以下幾種方法&#xff1a; 使用QFile和QTextStream類&#xff1a; 這種方法適用于讀取任意文本文件&#xff0c;包括配置文件。使用QFile的open()方法打開配置文件。使用QTextStream的readLine()方法逐行讀取配置數據。使用QXmlStreamRea…

谷粒商城學習-筆記大全

1&#xff0c;谷粒商城-01-項目介紹 2&#xff0c;谷粒商城筆記-02-項目整體效果展示 3&#xff0c;谷粒商城筆記-03-分布式基礎概念 4&#xff0c;谷粒商城筆記-04-項目微服務架構圖簡介 5&#xff0c;谷粒商城學習筆記-05-項目微服務劃分圖 6&#xff0c;谷粒商城學習-06-使用…

【LinuxC語言】手撕Http協議之accept_request函數實現(一)

文章目錄 前言accept_request函數作用accept_request實現解析方法根據不同方法進行不同操作http服務器響應格式unimplemented函數實現總結前言 在計算機網絡中,HTTP協議是一種常見的應用層協議,它定義了客戶端和服務器之間如何進行數據交換。在這篇文章中,我們將深入探討Li…

C++模塊化之內部類

目錄 1.引言 2.內部類的訪問控制 3.優缺點分析 4.實際運用 4.1.實現復雜數據結構 4.2.封裝細節實現 4.3.事件處理和回調 4.4.模板元編程輔助類 4.5. 訪問控制和封裝 4.6. 代碼組織和模塊化 5.總結 1.引言 在C中&#xff0c;內部類&#xff08;Nested Class&#xff…

力扣爆刷第159天之TOP100五連刷61-65(翻轉單詞、對稱二叉樹、遍歷求和)

力扣爆刷第159天之TOP100五連刷61-65&#xff08;翻轉單詞、對稱二叉樹、遍歷求和&#xff09; 文章目錄 力扣爆刷第159天之TOP100五連刷61-65&#xff08;翻轉單詞、對稱二叉樹、遍歷求和&#xff09;一、151. 反轉字符串中的單詞二、129. 求根節點到葉節點數字之和三、104. 二…

簡單解讀倫敦銀CFD(XAG)走勢圖

從本質上說&#xff0c;倫敦銀是一種差價合約&#xff08;CFD&#xff09;交易&#xff0c;在同平臺所提供的MT4中&#xff0c;它的代碼也許并不一樣&#xff0c;有的平臺會顯示為XAG&#xff0c;有的平臺會顯示為LLS或Silver&#xff0c;但它們指的其實是同一個品種&#xff0…

Python學習筆記29:進階篇(十八)常見標準庫使用之質量控制中的數據清洗

前言 本文是根據python官方教程中標準庫模塊的介紹&#xff0c;自己查詢資料并整理&#xff0c;編寫代碼示例做出的學習筆記。 根據模塊知識&#xff0c;一次講解單個或者多個模塊的內容。 教程鏈接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 質量控制…

基于單片機的防酒駕控制系統設計

摘 要&#xff1a; 酒后駕車的危害十分巨大&#xff0c;因此&#xff0c;筆者介紹了一種基于單片機的防酒駕控制系統。系統由酒精傳感器 MQ-3測量汽車駕駛員體內的酒精含量濃度&#xff0c;通過 A/D 轉換器轉換成數字信號傳給單片機&#xff0c;經過單片機處理后顯示酒精濃度&a…

c++11新特性-6-using

文章目錄 using1.定義別名 using 1.定義別名 1.1 定義類型別名 using t int; 1.2 定義函數指針 int test(double,string){}//返回值類型 int &#xff0c;參數類型&#xff1a;double string using func int(*) (double,string);int main() {func f test;f(10.5,“hello…

算法訓練營day69

查并集&#xff1a;107. 尋找存在的路徑 (kamacoder.com) #include<iostream> #include<vector>using namespace std;vector<int> father(101, 0);void init() {for(int i 1;i < 101;i) {father[i] i;} }int find(int v) {if(v father[v]) return v;e…

老年生活照護實訓室:為養老服務業輸送專業人才

本文探討了老年生活照護實訓室在養老服務業專業人才培養中的關鍵作用。通過詳細闡述實訓室的功能、教學實踐、對學生能力的培養以及面臨的挑戰和解決方案&#xff0c;強調了其在提升人才素質、滿足行業需求方面的重要性&#xff0c;旨在為養老服務業的可持續發展提供有力的人才…

electron教程(二)控制應用程序的事件生命周期

1.will-finish-launching 當應用程序完成基礎的啟動的時候被觸發&#xff0c;在 Windows 和 Linux 中, will-finish-launching 事件與 ready 事件是相同的; 在 macOS 中&#xff0c;這個事件相當于 NSApplication 中的 applicationWillFinishLaunching 提示。 app.on(will-fi…

Butterfly主題文章標題改成轉動小風車

效果 標題級別不同小風車顏色不同&#xff0c;鼠標移入會有轉動變慢及變色效果。 新建css 建議在/source下創建諸如img/css/js等文件夾&#xff0c;存放文章或網站用的素材&#xff0c;分門別類后續也方便維護。 Hexo打包的時候&#xff0c;會自動把/source下的文件&#…

深度神經網絡語言識別

「AI秘籍」系列課程&#xff1a; 人工智能應用數學基礎人工智能Python基礎人工智能基礎核心知識人工智能BI核心知識人工智能CV核心知識 使用 DNN 和字符 n-gram 對一段文本的語言進行分類&#xff08;附 Python 代碼&#xff09; 資料來源&#xff0c;flaticon&#xff1a;htt…

AI繪畫如何變現賺取副業收入?保姆級AI繪畫SD和MJ副業實操教程建議收藏!

hi~大家好&#xff0c;我是向陽。 今天給大家分享一下我是如何通過AI繪畫賺到一點小錢的&#xff01; 副業做個人IP&#xff0c;某書&#xff0c;專注Midjourney &#xff0c;深入 AI頭像制作&#xff0c;小某書做了500頭像&#xff0c;變現了差不多一萬元&#xff0c;每日短…

[qt][C++]object.h(448): error C2238: 意外的標記位于“;”之前

問題場景&#xff1a;此問題多發生在qt調用python.h&#xff0c;比如matplotlib-cpp等需要python引用的C庫 #include <Python.h>報錯 \python\python37-32\include\object.h(448): error C2059: 語法錯誤:“;” \python\python37-32\include\object.h(448): error C223…

鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【生成密鑰(C/C++)】

生成密鑰(C/C) 以生成ECC密鑰為例&#xff0c;生成隨機密鑰。具體的場景介紹及支持的算法規格。 注意&#xff1a; 密鑰別名中禁止包含個人數據等敏感信息。 開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復…

【C語言】五子棋(c語言實現)

這里寫目錄標題 最終效果菜單打印函數棋盤的初始化和打印人人對戰落子判空函數悔棋函數判勝負函數人人對戰 人機對戰一是將直接調用rand生成隨機值&#xff0c;這就不可控二是根據棋子贏面來判斷哪里落子最好 如果選擇退出程序直接exit就行主函數調用邏輯源代碼 最終效果 五子棋…