析構函數和拷貝構造函數

文章目錄

  • 析構函數
    • 1.析構函數的定義:
    • 2.析構函數的語法:
    • 3.析構函數的特性:
  • 拷貝構造函數
    • 1.拷貝構造函數的定義:
    • 2.拷貝構造函數的語法
    • 3.拷貝構造函數的特性
      • (1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解,由于構造函數實現的是對對象的初始化,而拷貝構造也是對對象的初始化,只不過需要把值進行拷貝,然后實現初始化,所以它們的功能是相似的,但它們的參數不同,所以它們構成函數的重載)**
      • (2)拷貝構造參數只能有一個,并且這個參數只能是類的類型對象的引用,用傳值的方式,編譯器會直接報錯,因為傳值調用會引發拷貝構造函數的無窮遞歸。
      • (3)如果沒有自定義一拷貝構造函數編譯器會自動生成一個默認的拷貝構造函數
      • (4)淺拷貝和深拷貝
  • 總結:

析構函數

1.析構函數的定義:

析構函數是為了完成清理工作的,但不是對對象本身的清理,局部對象的清理是由編譯器自動完成的,析構函數是對對象中的資源的清理。

2.析構函數的語法:

~+類名()

class Stack
{
public://析構函數不需要傳參過來,因為會有this指針傳過來~Stack()//析構函數:~+類名(){free(_a);_a = nullptr;_size = _capacity = 0;}private:int* _a;size_t _size;size_t _capacity;
};

3.析構函數的特性:

(1)析構函數無參數無返回值
(2)一個類只有一個析構函數,若沒有自定義析構函數,那么編譯器會自動生成析構函數,注意:析構函數是不能重載的。(這個為挺好理解的,如果你有多個函數都能實現清理的功能,由于析構函數是編譯器自動調用的,那么編譯器就不知道要調用那個函數來清理對象所占的資源了)
(3)對象的生命周期結束時,編譯器自動調用析構函數。
(4)編譯器自動生成的析構函數,對自定義成員變量會去調用它的析構函數, 但編譯器自動生成的構造函數和析構函數不會去初始化和清理內置類型/基本類型(int/char)

下面的代碼如果輸出~Time()這個字符串,就表示編譯器自動生成的析構函數會去調用自定義類型的析構函數

class Time
{
public:~Time(){cout << "~Time()" << endl;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本類型(內置類型)int _year = 1970;int _month = 1;int _day = 1;// 自定義類型Time _t;
};
int main()
{Date d;return 0;
}

在這里插入圖片描述

拷貝構造函數

1.拷貝構造函數的定義:

拷貝構造,顧名思義就是對一個對象的拷貝唄。

2.拷貝構造函數的語法

類名+(參數)

Date(const Date& d)
{//防止下面賦值操作寫錯,給d去掉可修改的權限_year = d._year;_month = d._month;_day = d._day;
}

3.拷貝構造函數的特性

(1)拷貝構造函數是構造函數的一個重載形式**(這個其實也很好理解,由于構造函數實現的是對對象的初始化,而拷貝構造也是對對象的初始化,只不過需要把值進行拷貝,然后實現初始化,所以它們的功能是相似的,但它們的參數不同,所以它們構成函數的重載)**

(2)拷貝構造參數只能有一個,并且這個參數只能是類的類型對象的引用,用傳值的方式,編譯器會直接報錯,因為傳值調用會引發拷貝構造函數的無窮遞歸。

在這里插入圖片描述

(3)如果沒有自定義一拷貝構造函數編譯器會自動生成一個默認的拷貝構造函數

(4)淺拷貝和深拷貝

下面來判斷一段代碼,看看這個代碼能否正常運行

typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申請空間失敗");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2(s1);return 0;
}

在這里插入圖片描述
代碼直接崩了,這是因為什么呢?容我慢慢道來
在這里插入圖片描述
注意:當類沒有涉及空間資源的開辟時,構造函數可自己寫也可不寫,一旦涉及資源的開辟時,構造函數必須自己寫,防止出現淺拷貝問題。

總結:

今天總結了析構函數和拷貝構造函數。

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

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

相關文章

鴻蒙開發設備管理:【@ohos.thermal (熱管理)】

熱管理 該模塊提供熱管理相關的接口&#xff0c;包括熱檔位查詢及注冊回調等功能。 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shi…

如何實現圖片垂直旋轉90度的問題

非常簡單的問題&#xff0c;一串代碼就可以解決。復制修改一下就可以直接使用&#xff0c;一個簡單的小demo。寫項目的時候需要寫的功能&#xff0c;不到二十行代碼就可以實現。 <html> <head><title>旋轉圖片</title><meta http-equiv"Conte…

Land survey boundary report (template)

Land survey boundary report (template) 土地勘測定界報告&#xff08;模板&#xff09;.doc

【高校科研前沿】南京地理與湖泊研究所博士后夏凡為第一作者在環境科學與水資源領域Top期刊發文:鈣對云南洱海溶解有機質與浮游細菌相互作用的調控作用

文章簡介 論文名稱&#xff1a;Calcium regulates the interactions between dissolved organic matter and planktonic bacteria in Erhai Lake, Yunnan Province, China 第一作者及單位&#xff1a;夏凡&#xff08;博士后|中國科學院南京地理與湖泊研究所&#xff09; 通訊…

Git指令

一 參考&#xff1a;https://zhuanlan.zhihu.com/p/389814854 1.clone遠程倉庫 git clone https://git.xiaojukeji.com/falcon-mg/dagger.git 2.增加當前子目錄下所有更改過的文件至index git add . 3.提交并備注‘xxx’ git commit -m ‘xxx’ 4.顯示本地分支 git branch 5.顯…

【pytorch13】激活函數及梯度

什么是激活函數 計算機科學家借鑒生物的神經元機制發明了計算機上的模型&#xff0c;這個模型與生物的神經元非常類似 激活的意思就是z變量要大于0&#xff0c;這一個節點才會激活&#xff0c;否則就會處于睡眠狀態不會輸出電平值 該激活函數在z0處不可導&#xff0c;因此不能…

Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 實踐 AOP 以及實現事務、用戶填充功能

文章目錄 什么是 AOP &#xff1f;.Net Core 中 有哪些 AOP 框架&#xff1f;基于 Castle DynamicProxy 實現 AOPIOC中使用 Castle DynamicProxy實現事務管理實現用戶自動填充 什么是 AOP &#xff1f; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面編程&a…

OpenCV——把YOLO格式的圖片目標截圖,并按目標類別保存

import os import cv2def get_class_folder(catagetory,class_id, base_folder):# 根據類別ID創建文件夾路徑class_folder os.path.join(base_folder, catagetory[int(class_id)])if not os.path.exists(class_folder):os.makedirs(class_folder)return class_folderdef crop_…

VPN是什么?

VPN&#xff0c;全稱Virtual Private Network&#xff0c;即“虛擬私人網絡”&#xff0c;是一種在公共網絡&#xff08;如互聯網&#xff09;上建立加密、安全的連接通道的技術。簡單來說&#xff0c;VPN就像是一條在公共道路上鋪設的“秘密隧道”&#xff0c;通過這條隧道傳輸…

圖像的反轉

圖像顏色的反轉一般分為兩種&#xff1a;一種是灰度圖片的顏色反轉&#xff0c;另一種是彩色圖像的顏色反轉。 本節使用的原圖如下&#xff1a; 1.1 灰度圖像顏色反轉 灰度圖像每個像素點只有一個像素值來表示&#xff0c;色彩范圍在0-255之間&#xff0c;反轉方法255-當前像…

信創產業政策,信創測試方面

信創產業的政策支持主要體現在多個方面&#xff0c;這些政策旨在推動產業的快速發展&#xff0c;加強自主創新能力&#xff0c;保障國家信息安全&#xff0c;以及促進產業結構的優化升級。 首先&#xff0c;政府通過財政支持、稅收優惠等方式&#xff0c;加大對信創產業的資金…

8.ApplicationContext常見實現

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件來創建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

Flutter——最詳細(Drawer)使用教程

背景 應用左側或右側導航面板&#xff1b; 屬性作用elevation相當于陰影的大小 import package:flutter/material.dart;class CustomDrawer extends StatelessWidget {const CustomDrawer({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {return…

解決SeaTunnel 2.3.4版本寫入S3文件報錯問題

在使用Apache SeaTunnel時&#xff0c;我遇到了一個寫入S3文件的報錯問題。通過深入調試和分析&#xff0c;找到了問題所在&#xff0c;并提出了相應的解決方案。 本文將詳細介紹報錯情況、參考資料、解決思路以及后續研究方向&#xff0c;希望對大家有幫助&#xff01; 一、…

代碼隨想錄算法訓練營第二天|【數組】977.有序數組的平方

題目 給你一個按 非遞減順序 排序的整數數組 nums&#xff0c;返回 每個數字的平方 組成的新數組&#xff0c;要求也按 非遞減順序 排序。 示例 1&#xff1a; 輸入&#xff1a;nums [-4,-1,0,3,10] 輸出&#xff1a;[0,1,9,16,100] 解釋&#xff1a;平方后&#xff0c;數組…

修改頭文件版本需要修改的文件

以修改ui的頭文件版本為例&#xff0c;還需要同時更新 PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include PJ10PC20240120041_c928\components\master-t5\hikauto\module\app\include\dsp PJ10PC20240120041_c928\components\master-t5\hikauto\incl…

C# Halcon目標檢測算法

在Halcon中進行目標檢測可以使用傳統的計算機視覺方法&#xff0c;也可以使用深度學習的方法。Halcon提供了豐富的函數庫來處理這些任務&#xff0c;而在C#中使用Halcon&#xff0c;你需要通過Halcon .NET接口。 以下是使用Halcon進行目標檢測的一般步驟&#xff0c;這里我將給…

DDL:針對于數據庫、數據表、數據字段的操作

數據庫的操作 # 查詢所有數據 SHOW DATABASE; #創建數據庫 CREATE DATABASE 2404javaee; #刪除數據庫 DROP DATABASE 2404javaee; 數據表的操作 #創建表 CREATE TABLE s_student( name VARCHAR(64), s_sex VARCHAR(32), age INT(3), salary FLOAT(8,2), c_course VARC…

Windows 的 MFC開發的使用示例——講得挺好的

【Visual Studio 2019】創建 MFC 桌面程序 ( 安裝 MFC 開發組件 | 創建 MFC 應用 | MFC 應用窗口編輯 | 為按鈕添加點擊事件 | 修改按鈕文字 | 打開應用 )-騰訊云開發者社區-騰訊云 (tencent.com)

【算法】(C語言):堆排序

堆&#xff08;二叉樹的應用&#xff09;&#xff1a; 完全二叉樹。最大堆&#xff1a;每個節點比子樹所有節點的數值都大&#xff0c;根節點是最大值。父子索引號關系&#xff08;根節點為0&#xff09;&#xff1a;&#xff08;向上&#xff09;子節點x&#xff0c;父節點(x…