深入理解構造函數:C++ 編程中的基石

一、概念

????????構造函數(Constructor) 是一種特殊的成員函數,用于在創建對象時初始化對象的狀態(即成員變量)。它的主要作用是保證對象在創建時具有有效的初始值。


二、特點

與類同名

  • 構造函數的名稱與類名相同,沒有返回值(甚至不能寫 void)。

自動調用

  • 構造函數在對象創建時自動調用,無需顯式調用。

可以重載

  • 構造函數可以有多個版本,依賴于參數個數和類型(重載)。

無返回值

  • 構造函數沒有返回值,也不能通過返回值來傳遞信息。

默認構造函數

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

三、種類

1. 默認構造函數

無參數的構造函數,稱為默認構造函數。

  • 作用:初始化對象為默認狀態。
  • 示例:
class Example {
public:Example() {  // 默認構造函數cout << "Default constructor called" << endl;}
};int main() {Example obj;  // 自動調用默認構造函數return 0;
}

2. 帶參數的構造函數

構造函數可以帶參數,用于初始化對象時傳遞參數。

  • 示例:
class Example {
private:int value;
public:Example(int v) {  // 帶參數的構造函數value = v;cout << "Constructor called with value: " << value << endl;}
};int main() {Example obj(10);  // 調用帶參數的構造函數return 0;
}

3. 拷貝構造函數

拷貝構造函數用于創建一個對象時,以另一個同類型的對象對其初始化。

  • 特點:參數是同類的引用類型,通常形式為 ClassName(const ClassName &obj)
  • 示例:
class Example {
private:int value;
public:Example(int v) {value = v;cout << "Parameterized constructor called" << endl;}Example(const Example &obj) {  // 拷貝構造函數value = obj.value;cout << "Copy constructor called" << endl;}
};int main() {Example obj1(10);         // 調用帶參數的構造函數Example obj2 = obj1;      // 調用拷貝構造函數return 0;
}

4. 委托構造函數

一個構造函數可以調用另一個構造函數來簡化代碼邏輯。

  • 示例:
class Example {
private:int value;
public:Example() : Example(0) {  // 調用另一個構造函數cout << "Default constructor called" << endl;}Example(int v) {value = v;cout << "Parameterized constructor called with value: " << value << endl;}
};int main() {Example obj;   // 調用默認構造函數,同時委托到帶參數的構造函數return 0;
}

5. 默認和刪除的構造函數

  • 可以顯式指定構造函數為默認的或刪除的(C++11 引入)。
  • 示例:
class Example {
public:Example() = default;  // 默認構造函數Example(int) = delete;  // 禁止使用此構造函數
};int main() {Example obj1;     // 可以// Example obj2(10);  // 錯誤,無法使用刪除的構造函數return 0;
}

四、構造函數的使用與初始化列表

初始化成員變量

可以在構造函數中直接初始化成員變量,或使用 初始化列表 初始化。

  • 示例:
class Example {
private:int a;int b;
public:Example(int x, int y) : a(x), b(y) {  // 初始化列表cout << "a = " << a << ", b = " << b << endl;}
};int main() {Example obj(10, 20);  // 調用構造函數return 0;
}

初始化列表

  • 初始化列表在對象構造時直接賦值,而不是先默認構造后再賦值,因此效率更高。
  • 某些情況必須使用初始化列表,例如常量成員變量或引用類型。

五、子類構造函數

工作流程

  1. 創建子類對象時,必須先調用父類的構造函數。
  2. 如果子類的構造函數沒有顯式調用父類的構造函數,則會默認調用父類的無參構造函數。
  3. 如果父類沒有無參構造函數,子類必須顯式調用父類的某個構造函數。

示例:

#include <iostream>
using namespace std;class Parent {
public:Parent(int x) {cout << "Parent constructor called with value: " << x << endl;}
};class Child : public Parent {
public:Child(int x) : Parent(x) {  // 顯式調用父類的構造函數cout << "Child constructor called" << endl;}
};int main() {Child obj(10);  // 調用子類構造函數return 0;
}

輸出:

Parent constructor called with value: 10
Child constructor called

六、構造函數的注意點

沒有返回值: 構造函數沒有返回值,不能使用 return 返回值。

拷貝構造函數的深拷貝與淺拷貝: 如果類中有指針類型成員變量,拷貝構造函數默認執行淺拷貝,這可能會導致資源沖突,建議實現深拷貝。

靜態成員的初始化: 靜態成員變量需要在類外初始化,不能通過構造函數初始化。

繼承中的構造函數:父類的構造函數不會被子類繼承,但可以通過子類構造函數顯式調用。


構造函數與析構函數的關系

  • 析構函數與構造函數相反,用于對象銷毀時釋放資源。
  • 析構函數在子類對象銷毀時按照從子類到父類的順序調用。

示例:

#include <iostream>
using namespace std;class Parent {
public:Parent() { cout << "Parent constructor called" << endl; }~Parent() { cout << "Parent destructor called" << endl; }
};class Child : public Parent {
public:Child() { cout << "Child constructor called" << endl; }~Child() { cout << "Child destructor called" << endl; }
};int main() {Child obj;  // 創建子類對象return 0;
}

輸出:

Parent constructor called
Child constructor called
Child destructor called
Parent destructor called

七、總結

  1. 構造函數是初始化對象的入口,可以重載。
  2. 帶參數構造函數和拷貝構造函數提供了靈活的初始化方式。
  3. 初始化列表是高效的初始化方式,尤其適合常量或引用類型。
  4. 父類的構造函數必須在子類構造函數中顯式調用(如果沒有無參構造函數)。
  5. 析構函數與構造函數互補,用于釋放資源。

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

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

相關文章

GIS數據處理/程序/指導,街景百度熱力圖POI路網建筑物AOI等

簡介其他數據處理/程序/指導&#xff01;&#xff01;&#xff01;&#xff08;1&#xff09;街景數據獲取&#xff08;2&#xff09;街景語義分割后像素提取&#xff0c;指標計算代碼&#xff08;綠視率&#xff0c;天空開闊度、視覺熵/景觀多樣性等&#xff09;&#xff08;3…

微前端qiankun的使用——實踐

qiankun 創建主應用項目——vue2 main.js注冊子應用 $ yarn add qiankun # 或者 npm i qiankun -Simport { registerMicroApps, start } from qiankun; import Vue from "vue"; import App from "./App.vue"; import router from "./router"; …

后端項目java中字符串、集合、日期時間常用方法

我這里只介紹了項目中最常用的哈,比如像集合有很多,但我們最常用的就是ArrayList。 然后我這里會以javascript中的字符串、數組的方法為基準來實現,有些方法js和java會有些區別也會介紹 字符串 每次修改 String 對象都會創建一個新的對象,而 StringBuffer 可以在同一個對象…

Ubuntu 22.04永久保存路由

在 Ubuntu 22.04 上&#xff0c;可以按照以下方式配置讓流量訪問 172.19.201.207 走指定的路由。 1. 臨時添加路由 臨時路由規則只在當前系統會話中有效&#xff0c;重啟后會丟失。 添加路由規則 運行以下命令&#xff1a; sudo ip route add 172.19.201.207 via 192.168.2…

實用 Linux 之命令(Practical Linux Commands)

實用 Linux之 命令&#xff0c;可以解決日常99%的問題~ 1、基本命令 uname -m 顯示機器的處理器架構uname -r 顯示正在使用的內核版本dmidecode -q 顯示硬件系統部件(SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁盤的架構特性hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作…

SAP SD客戶主數據及其配置

一、客戶主數據概述 在SD模塊概覽中對于SD模塊及其有關的三大主數據進行了概要介紹&#xff0c;本篇文章將重點對于客戶主數據進行有關介紹。 1、業務伙伴主數據 在提到客戶主數據之前&#xff0c;我們先了解業務伙伴主數據的概念。 業務伙伴主數據是一個更廣泛的概念&#x…

GitCode 光引計劃征文展示|MilvusPlus:開啟向量數據庫新篇章

在人工智能和大數據時代&#xff0c;向量數據庫作為處理非結構化數據的核心技術&#xff0c;正變得越來越重要。MilvusPlus&#xff0c;作為「光引計劃」的一部分&#xff0c;應運而生&#xff0c;旨在提供一個高性能、易擴展、全功能的向量數據庫解決方案。項目背景根植于對現…

網絡架構與IP技術:4K/IP演播室制作的關鍵支撐

隨著科技的不斷發展&#xff0c;廣播電視行業也在不斷迭代更新&#xff0c;其中4K/IP演播室技術的應用成了一個引人注目的焦點。4K超高清技術和IP網絡技術的結合&#xff0c;不僅提升了節目制作的畫質和效果&#xff0c;還為節目制作帶來了更高的效率和靈活性。那么4K超高清技術…

30多種獨特藝術抽象液態酸性金屬鍍鉻封面背景視覺紋理MOV視頻素材

使用 Prismatic Flows 轉換您的項目&#xff01;這個包擁有 30 多種獨特的液體背景和動畫&#xff0c;為任何創意活動提供令人驚嘆的視覺效果。 棱鏡流 – 動畫背景和迭加包括30多種不同的液體背景和動畫。這些高質量的資源非常適合通過充滿活力和動態的視覺效果來增強您的項目…

32. 線程、進程與協程

一、什么是多任務 如果一個操作系統上同時運行了多個程序&#xff0c;那么稱這個操作系統就是 多任務的操作系統&#xff0c;例如&#xff1a;Windows、Mac、Android、IOS、Harmony 等。如果是一個程序&#xff0c;它可以同時執行多個事情&#xff0c;那么就稱為 多任務的程序。…

概率論 期末 筆記

第一章 隨機事件及其概率 利用“四大公式”求事件概率 習題 推導 全概率公式與貝葉斯公式 伯努利概型求概率 一維隨機變量及其分布

VLAN數據格式

概念&#xff1a;VLAN叫做虛擬局域網&#xff0c;指在物理網絡中根據用于、工作組、應用等進行邏輯劃分的局域網&#xff0c;是一個廣播域&#xff0c;與用戶的物理位置沒有關系。 作用&#xff1a;VLAN可以靈活的進行分段和組織&#xff0c;能夠實現更好的安全性&#xff0c;…

css 裁剪 clip-path

clip-path 是一個強大的 CSS 屬性&#xff0c;用于裁剪元素的可視區域&#xff0c;支持多種形狀裁剪。它可以用來創建復雜的裁剪效果&#xff0c;如圓形、多邊形、路徑等。 clip-path: none | shape | url(#clipPathId);none&#xff1a;不裁剪&#xff0c;顯示完整內容。shap…

*【每日一題 基礎題】 [藍橋杯 2023 省 B] 飛機降落

題目描述 N 架飛機準備降落到某個只有一條跑道的機場。其中第 i 架飛機在 Ti 時刻到達機場上空&#xff0c;到達時它的剩余油料還可以繼續盤旋 Di 個單位時間&#xff0c;即它最早可以于 Ti 時刻開始降落&#xff0c;最晚可以于 Ti Di 時刻開始降落。降落過程需要 Li個單位時間…

計算機vcruntime140_1.dll丟失是什么原因?vcruntime140_1.dll丟失的解決辦法如下:

計算機中vcruntime140_1.dll文件丟失的原因可能有多種&#xff0c;以下是一些常見的原因&#xff1a; 安裝不完整或損壞&#xff1a;某些應用程序在安裝過程中可能因為意外中斷、安裝程序損壞或其他原因導致vcruntime140_1.dll未能正確安裝或復制到系統目錄。軟件卸載或更新不…

Redis學習(三)緩存

Redis學習&#xff08;三&#xff09;緩存 一、什么是緩存?如何使用緩存 二、添加商戶緩存1、緩存模型和思路2、緩存更新策略1、數據庫緩存不一致解決方案&#xff1a;2、數據庫和緩存不一致采用什么方案 3、實現商鋪和緩存與數據庫雙寫一致 三、緩存穿透問題的解決思路1、編碼…

軟件設計與體系結構

1.簡要說明什么是軟件體系結構&#xff0c;軟件體系結構模型&#xff0c;為什么要建立軟件體系結構模型&#xff1f; 答&#xff1a;軟件體系結構指一個軟件系統在高層次上的結構化組織方式&#xff0c;包括系統的組成部分和各個部分之間的關系&#xff0c;以及它們與環境之間的…

Essential Use Cases和Real Use Cases

在軟件開發領域&#xff0c;用例&#xff08;Use Cases&#xff09;是一種非常重要的工具&#xff0c;它能夠幫助開發團隊、產品經理以及用戶之間對系統的功能需求達成一致。用例描述了在特定條件下&#xff0c;系統對用戶請求所做出的響應&#xff0c;從而清晰地表達了系統的行…

P102如何降頻降壓

要對NVIDIA P102顯卡進行降頻降壓操作&#xff0c;可以按照以下步驟進行&#xff1a; ? 使用MSI Afterburner軟件&#xff1a; ? 打開MSI Afterburner&#xff0c;使用曲線編輯器調整頻率和電壓。豎軸為核心頻率&#xff0c;橫軸為電壓。通過整體下移靠后的頻率和電壓區域&a…

概率論得學習和整理32: 用EXCEL描述正態分布,用δ求累計概率,以及已知概率求X的區間

目錄 1 正態分布相關 2 正態分布的函數和曲線 2.1 正態分布的函數值&#xff0c;用norm.dist() 函數求 2.2 正態分布的pdf 和 cdf 2.3 正態分布的圖形隨著u 和 δ^2的變化 3 正態分布最重要的3δ原則 3.0 注意&#xff0c;這里說的概率一定是累計概率CDF&#xff0c;而…