【C++11】=default與=delete關鍵字使用詳解

系列文章目錄

C++11新特性使用詳解-持續更新


文章目錄

    • 系列文章目錄
    • 一、=default關鍵字
      • 1. 為什么要引入=default關鍵字
      • 2. 注意事項
      • 3. 使用=default關鍵字有什么好處
      • 4.實例代碼
    • 二、=delete關鍵字
      • 1. 為什么要引入=delete關鍵字
      • 2. 注意事項
      • 3. 使用場景
        • 3.1刪除默認構造函數
        • 3.2 刪除拷貝構造函數和拷貝賦值運算符
        • 3.3 刪除重載操作符
        • 3.4 為什么不直接刪除函數用


一、=default關鍵字

=default關鍵字是C++11標準中引入的一個新特性,它用于告訴編譯器生成默認的函數實現。

1. 為什么要引入=default關鍵字

在C++11之前,我們通常需要手動實現所有的函數,包括構造函數、拷貝構造函數、拷貝賦值運算符等等。但是有時候我們并不想為每個函數都編寫實現,這時候就可以使用=default關鍵字來生成默認的實現。

2. 注意事項

  • 只能對具有合成版本的成員函數使用=default(即默認構造函數或拷貝控制成員)
  • 如果我們已經為某個函數提供了實現,那么就不能再使用=default關鍵字了。這樣做會導致編譯錯誤。
  • 類內用=default修飾成員的聲明時,合成的函數將隱式地聲明為內聯,如果不希望隱式內聯,應該只對成員的類外定義使用=default
  • 當構造函數需要申請內存資源時,我們通常需要手動編寫構造函數的定義,并在其中使用適當的內存分配函數(如new)來申請內存。這樣可以確保在對象創建時分配所需的內存,并在析構函數中釋放這些內存。

3. 使用=default關鍵字有什么好處

它可以幫助我們減少代碼量,提高代碼的可讀性和可維護性。
但是需要注意的是,只有在必要的情況下才應該使用=default關鍵字,否則可能會影響程序的性能和可讀性。

4.實例代碼

class MyClass
{
public:MyClass() = default;   //默認構造函數MyClass(const MyClass&) = default;    //默認構拷貝造函數MyClass& operator = (const MyClass&) = default;   //默認拷貝賦值運算符MyClass(int i) { a = i; }; private:int a;std::string s;char* p;
};int main()
{//defaultMyClass a1;MyClass a2 = a1;MyClass a3;a3 = a1;std::cout << "Hello World!\n";
}

二、=delete關鍵字

1. 為什么要引入=delete關鍵字

雖然大多數類應該定義拷貝構造函數和拷貝賦值運算符,無論是隱式的還是顯式的。但某些類這些操作沒有意義,這種情況下必須采用某種機制阻止拷貝或賦值。
=delete是C++11引入的一個新的關鍵字,它用于顯式地刪除一個已經定義的函數或操作符來阻止拷貝。

這個關鍵字告訴編譯器,我們不希望這個函數或操作符被調用,即使在代碼中出現了這樣的調用也會導致編譯錯誤。

比如iostream類阻止了拷貝,以避免多個對象寫入或讀取相同的IO緩存。
還有unique_ptrye阻止了拷貝,防止多個指針指向同一對象(破壞獨占性)。

2. 注意事項

不能刪除析構函數,如果析構函數被刪除,就無法銷毀此類型的臨時對象。

某一個成員的析構函數是刪除的,則該成員無法銷毀,因而整個對象也無法被銷毀

3. 使用場景

3.1刪除默認構造函數

默認構造函數是沒有參數的構造函數,它會在沒有提供其他構造函數的情況下自動生成。但是,如果我們不希望這個默認構造函數被調用,可以使用=delete關鍵字來刪除它。

class MyClass {
public:MyClass() = delete; // 刪除默認構造函數
};
3.2 刪除拷貝構造函數和拷貝賦值運算符

拷貝構造函數和拷貝賦值運算符用于創建一個新對象,并將其初始化為另一個同類型對象的副本。但是,如果我們不想讓對象被復制,可以使用=delete關鍵字來刪除這兩個操作符。

class MyClass {
public:MyClass(const MyClass&) = delete; // 刪除拷貝構造函數MyClass& operator=(const MyClass&) = delete; // 刪除拷貝賦值運算符
};
3.3 刪除重載操作符

我們可以在自定義類型上重載操作符,以便使用它們時就像使用內置類型一樣。但是,如果我們不想讓某個操作符被重載,可以使用=delete關鍵字來刪除它。

class MyClass {
public:void operator()(int x) = delete // 刪除重載了括號運算符  
};
3.4 為什么不直接刪除函數用

直接刪除函數和用=delete關鍵字刪除函數的效果是一樣的,都是從代碼中移除了函數定義。但是,使用=delete關鍵字相比直接刪除函數,能更清晰、更明確地表達我們的意圖,提高代碼的可讀性和可維護性。

  • 明確地告訴了編譯器和其他的開發者,這個函數是不應該被調用的。這樣,如果在代碼中出現了對這個函數的調用,編譯器就會報錯,避免了潛在的錯誤和bug。

  • 幫助開發者更好地理解和閱讀代碼。通過查看函數前面的=delete關鍵字,我們可以快速地判斷出這個函數是否應該被調用,而不必去深入閱讀函數的實現細節。


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

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

相關文章

2023.11.22 -數據倉庫的概念和發展

目錄 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1經典傳統數倉架構 2離線大數據數倉架構 3數據倉庫三層 數據運營層,源數據層&#xff08;ODS&#xff09;&#xff08;Operational Data Store&#xff09; 數據倉庫層&#…

開發上門送桶裝水小程序要考慮哪些業務場景

上門送水業務已經有很長一段時間了&#xff0c;但是最開始都是給用戶發名片、貼小廣告&#xff0c;然后客戶電話訂水&#xff0c;水站工作人員再上門去送&#xff0c;這種人工記單和派單效率并不高&#xff0c;并且電話溝通中也比較容易出現偏差&#xff0c;那么根據這個情況就…

IT 領域中的主要自動化趨勢

48%的IT自動化流程屬于IT服務管理&#xff0c;過去一年中&#xff0c;IT運維自動化增長了272%。 IT部門從交付者轉變為戰略伙伴 今年的《工作自動化指數》數據顯示&#xff0c;自動化正在蔓延到組織的各個部門&#xff0c;越來越多的部門采用自動化&#xff0c;并且IT以外的員工…

一條命令徹底卸載Linux自帶多個版本jdk

一條命令徹底卸載Linux自帶多個版本jdk 檢查系統已經安裝的jdk rpm -qa | grep java卸載所有已經安裝的 jdk xargs 將參數逐個傳遞 將已安裝的 java 程序逐個當做參數傳遞給 rpm -e --nodeps rpm -qa | grep java | xargs rpm -e --nodeps再次檢查系統已經安裝的jdk rpm -qa | …

JS實現二分查找

最近在面試的時候被問到手寫實現二分查找&#xff0c;雖然二分查找很早就聽過&#xff0c;也知道實現原理&#xff0c;但是手擼起來&#xff0c;總是差點意思&#xff0c;正好復習一下。作為前端程序員&#xff0c;可能面試絕大部分公司不需要能寫很復雜的算法問題&#xff0c;…

Azure Machine Learning - 搜索中的語義排名

目錄 什么是語義排名&#xff1f;語義排名的工作原理如何收集和總結輸入語義排名的輸出如何對摘要進行評分 語義功能和限制 在 Azure AI 搜索中&#xff0c;“語義排名”通過使用語言理解對搜索結果重新排名來顯著提高搜索相關性&#xff0c; 本文概括性地介紹了語義排名工作原…

Nodejs JavaScript 字符串加密

情景 問題的場景是這樣的&#xff1a;我們需要在瀏覽器cookie中存儲用戶名&#xff0c;但又不想直接明文存儲&#xff0c;所以對它進行了簡單的加密存儲。 因為是簡單的加密&#xff0c;目的只是不希望明文存儲。我們使用了Base64 編碼&#xff0c;使得cookie里的存儲不可只讀…

Arthas 監聽 Docker 部署的java項目CPU占比高的信息

1、Linux上安裝Arthas wget https://alibaba.github.io/arthas/arthas-boot.jar2、docker ps 查看目標項目的容器ID 3、copy Arthas 到目標容器中 (注意有 &#x1f615; ) docker cp arthas-boot.jar d97e8666666:/4、進入到目標容器目錄中 docker exec -it d97e8666666 /b…

5-7求三種數的和

#include<stdio.h> int main(){double sum10;double sum20;double sum30;double sum;int i;for(i1;i<100;i){sum1sum1i;}printf("sum1結果是&#xff1a;%15.6f\n",sum1);for(i1;i<50;i){sum2sum2i*i;}printf("sum2結果是&#xff1a;%15.6f\n"…

TS是什么、為什么、怎么辦

TS是什么 javascript程序的靜態類型檢查器 為什么要用TS js編寫時在預期不同類型值的地方使用了某種類型的值&#xff0c;導致常見的類型錯誤 js只能提供動態類型&#xff0c;也就是運行一下代碼才能知道發生了什么&#xff0c;需要靜態類型的檢查 TS怎么用 1、安裝vscode…

連接服務器的腳本

對于記不住的服務器密碼且不愿用三方工具俺簡單寫了個腳本&#xff08;檢測下最近shell腳本的學習效果咋樣&#xff09; expect 是處理交互的一種腳本語言&#xff0c;spawn啟動指定進程 -> expect獲取指定關鍵字 -> send想指定進程發送指定指令 -> 執行完成后退出 sp…

Oracle:poor sql導致的latch: cache buffers chains案例

巡檢時&#xff0c;執行如下sql發現長會話&#xff1a; SELECT SE.SID,SE.SERIAL#,TO_CHAR(LOGON_TIME,YYYY-MM-DD HH24:MI:SS),SE.STATUS,SE.OSUSER,SE.MACHINE,SE.PROGRAM,SE.BLOCKING_SESSION, SE.SQL_ID,SE.PREV_SQL_ID ,SE.EVENT,SE.P1TEXT,SE.P1,SE.P2TEXT,SE.P2,SE.P3…

LeetCode1161. Maximum Level Sum of a Binary Tree

文章目錄 一、題目二、題解 一、題目 Given the root of a binary tree, the level of its root is 1, the level of its children is 2, and so on. Return the smallest level x such that the sum of all the values of nodes at level x is maximal. Example 1: Input:…

visionOS空間計算實戰開發教程Day 4 初識ImmersiveSpace

細心的讀者會發現在在??Day1???和??Day2???的示例中我們使用的都是??WindowGroup??。 main struct visionOSDemoApp: App {var body: some Scene {WindowGroup {ContentView()}} } 本節我們來認識在visionOS開發中會經常用到的另一個概念??ImmersiveSpace??…

Spark---集群搭建

Standalone集群搭建與Spark on Yarn配置 1、Standalone Standalone集群是Spark自帶的資源調度框架&#xff0c;支持分布式搭建&#xff0c;這里建議搭建Standalone節點數為3臺&#xff0c;1臺master節點&#xff0c;2臺worker節點&#xff0c;這虛擬機中每臺節點的內存至少給…

transformer之KV Cache

一、為什么要研究KV Cache 非常有效的加速推理速度&#xff0c;效果如下所示&#xff1a; import numpy as np import time import torch from transformers import AutoModelForCausalLM, AutoTokenizer NAME_OR_PATH r*************** device "cuda" if torch.cu…

中職組網絡安全 Server-Hun-1.img Server-Hun-2.img

一串密碼 smbuser用戶和密碼登錄ssh還是失敗提示需要密鑰&#xff0c;嘗試ftp登錄成功 發現密鑰存放在.ssh/下&#xff0c;在kali上生成一個密鑰&#xff0c;通過上傳到.ssh/下&#xff0c;將其替換掉 使用kali生成密鑰 登錄成功,但是無法拿到root目錄下的flag 獲取root用戶權限…

電子學會C/C++編程等級考試2022年12月(一級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:加一 輸入一個整數x,輸出這個整數加1后的值,即x+1的值。 時間限制:1000 內存限制:65536輸入 一個整數x(0 ≤ x ≤ 1000)。輸出 按題目要求輸出一個整數。樣例輸入 9樣例輸出 10 答案: //參考答案: #include<bits/st…

opencv-常用代碼

以下是一些OpenCV中常用的代碼片段&#xff0c;涵蓋了一些基本的圖像處理和計算機視覺任務。 加載和顯示圖像: import cv2# 讀取圖像 img cv2.imread(image.jpg)# 顯示圖像 cv2.imshow(Image, img) cv2.waitKey(0) cv2.destroyAllWindows()調整圖像大小: resized_img cv2.res…

鴻蒙4.0開發筆記之DevEco Studio頁面操作router的pushUrl頁面跳轉與back返回上一頁(五)

一、認識組件 關于HarmonyOS中ArkTS的基礎組件請參見文章鴻蒙4.0開發筆記之ArkTs語言基礎與基本組件結構&#xff08;四&#xff09; 二、實現頁面跳轉pushUrl 1、操作說明 實現頁面跳轉的核心便是router.pushUrl的調用&#xff0c;操作起來也很簡單&#xff0c;總共就四步…