最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中關于=default和=delete問題

 更新時間:2023年07月14日 09:18:06   作者:一傾而盡  
這篇文章主要介紹了C++中關于=default和=delete問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

什么是默認功能呢(Defaulted Function)

明確默認的函數(shù)聲明式一種新的函數(shù)聲明方式,在C++11發(fā)布時做出了更新。C++11允許添加“=default”說明符到函數(shù)聲明的末尾,以將該函數(shù)聲明為顯示默認構造函數(shù)。

這就使得編譯器為顯示默認函數(shù)生成了默認實現(xiàn),它比手動編程函數(shù)更加有效。

例如,每當我們聲明一個有參構造函數(shù)時,編譯器就不會創(chuàng)建默認構造函數(shù)。在這種情況下,我們可以使用default說明符來創(chuàng)建默認說明符。

以下代碼演示了如何創(chuàng)建:

// use of defaulted functions
#include <iostream>
using namespace std;
class A {
public:
    // A user-defined
    A(int x){
        cout << "This is a parameterized constructor";
    }
    // Using the default specifier to instruct
    // the compiler to create the default implementation of the constructor.
    A() = default;
};
int main(){
    A a;          //call A()
    A x(1);       //call A(int x)
    cout<<endl;
    return 0;
} 

在這里插入圖片描述

在上面的例子中,我們不必指定構造函數(shù)A()的主體,因為通過附加說明符’= default’,編譯器將創(chuàng)建此函數(shù)的默認實現(xiàn)。

使用此“=default”符號有什么限制?

默認函數(shù)需要用于特殊的成員函數(shù)(默認構造函數(shù),復制構造函數(shù),析構函數(shù)等),或者沒有默認參數(shù)。

例如,以下代碼解釋了非特殊成員函數(shù)不能默認:

// non-special member functions can't be defaulted(非特殊成員函數(shù)不能使用default) 
class B { 
public: 
    // Error, func is not a special member function. 
    int func() = default;  
    // Error, constructor B(int, int) is not a special member function. 
    B(int, int) = default;  
    // Error, constructor B(int=0) has a default argument. 
    B(int = 0) = default;  
}; 
int main() { 
    return 0; 
} 

運行結果:

在這里插入圖片描述

當我們可以使用“{}”簡單的空的實體時,使用’= default’有什么優(yōu)點?

盡管兩者可能表現(xiàn)相同,但使用default而不是使用{}仍然有一定的好處。

以下幾點做了一定的解釋:

1、給用戶定義的構造函數(shù),即使它什么也不做,使得類型不是聚合,也不是微不足道的。如果您希望您的類是聚合類型或普通類型(或通過傳遞性,POD類型),那么需要使用’= default’。

2、使用’= default’也可以與復制構造函數(shù)和析構函數(shù)一起使用。例如,空拷貝構造函數(shù)與默認拷貝構造函數(shù)(將執(zhí)行其成員的復制副本)不同。對每個特殊成員函數(shù)統(tǒng)一使用’= default’語法使代碼更容易閱讀。

再來說一下Deleted Function

在C ++ 11之前,操作符delete 只有一個目的,即釋放已動態(tài)分配的內(nèi)存。

而C ++ 11標準引入了此操作符的另一種用法,即:禁用成員函數(shù)的使用。

這是通過附加= delete來完成的; 說明符到該函數(shù)聲明的結尾。

使用’= delete’說明符禁用其使用的任何成員函數(shù)稱為expicitly deleted函數(shù)。

雖然不限于它們,但這通常是針對隱式函數(shù)。

以下示例展示了此功能派上用場的一些任務:

禁用拷貝構造函數(shù)

// copy-constructor using delete operator 
#include <iostream> 
using namespace std; 
class A { 
public: 
    A(int x): m(x) { } 
    // Delete the copy constructor 
    A(const A&) = delete;      
    // Delete the copy assignment operator 
    A& operator=(const A&) = delete;  
    int m; 
}; 
int main() { 
    A a1(1), a2(2), a3(3); 
    // Error, the usage of the copy assignment operator is disabled 
    a1 = a2;   
    // Error, the usage of the copy constructor is disabled 
    a3 = A(a2);  
    return 0; 
} 

禁用不需要的參數(shù)轉換

// type conversion using delete operator 
#include <iostream> 
using namespace std; 
class A { 
public: 
    A(int) {} 
    // Declare the conversion constructor as a  deleted function. Without this step,  
    // even though A(double) isn't defined,  the A(int) would accept any double value
    //  for it's argumentand convert it to an int 
    A(double) = delete;  
}; 
int main() { 
    A A1(1); 
    // Error, conversion from  double to class A is disabled. 
    A A2(100.1);  
    return 0; 
} 

請注意,刪除的函數(shù)是隱式內(nèi)聯(lián)的,這一點非常重要。

刪除的函數(shù)定義必須是函數(shù)的第一個聲明。

換句話說,以下方法是將函數(shù)聲明為已刪除的正確方法:

class C {
public:
         C(C& a) = delete;
};

但是以下嘗試聲明刪除函數(shù)的方法會產(chǎn)生錯誤:

// incorrect syntax of declaring a member function as deleted 
class C  { 
public: 
    C(); 
}; 
// Error, the deleted definition of function C must be the first declaration of the function. 
C::C() = delete;  

明確刪除函數(shù)有什么好處?

刪除特殊成員函數(shù)提供了一種更簡潔的方法來防止編譯器生成我們不想要的特殊成員函數(shù)。(如“禁用拷貝構造函數(shù)”示例中所示)。

刪除正常成員函數(shù)或非成員函數(shù)可防止有問題的類型導致調用非預期函數(shù)(如“禁用不需要的參數(shù)轉換”示例中所示)。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用C++中string實現(xiàn)任意長度的正小數(shù)、整數(shù)之間加減法方法實例

    使用C++中string實現(xiàn)任意長度的正小數(shù)、整數(shù)之間加減法方法實例

    這篇文章主要介紹了利用C++中string函數(shù)實現(xiàn)任意長度的正小數(shù)、整數(shù)之間加減法方法實例,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-06-06
  • C++學習之如何進行內(nèi)存資源管理

    C++學習之如何進行內(nèi)存資源管理

    與java、golang等自帶垃圾回收機制的語言不同,C++并不會自動回收內(nèi)存,這往往會導致內(nèi)存泄漏和內(nèi)存溢出等問題,所以掌握C++中的內(nèi)存管理技巧和工具是非常重要的,本文就來和大家詳細講講
    2023-05-05
  • C 語言基礎教程(我的C之旅開始了)[四]

    C 語言基礎教程(我的C之旅開始了)[四]

    C 語言基礎教程(我的C之旅開始了)[四]...
    2007-02-02
  • C++實現(xiàn)STL迭代器萃取的示例代碼

    C++實現(xiàn)STL迭代器萃取的示例代碼

    迭代器是一種抽象的設計概念,它提供了一種方法,使之能夠依序巡訪某個聚合物(容器)所含的各個元素,而又無需暴露該聚合物的內(nèi)部表述方式。本文主要介了STL迭代器萃取的方法,需要的可以參考一下
    2022-11-11
  • 一文詳解C++11中的lambda函數(shù)

    一文詳解C++11中的lambda函數(shù)

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學習一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C語言實現(xiàn)對bmp格式圖片打碼

    C語言實現(xiàn)對bmp格式圖片打碼

    這篇文章主要介紹了C語言實現(xiàn)對bmp格式圖片打碼
    2016-01-01
  • C++實現(xiàn)圖書管理系統(tǒng)最新版

    C++實現(xiàn)圖書管理系統(tǒng)最新版

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理系統(tǒng)最新版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    C語言詳細圖解浮點型數(shù)據(jù)的存儲實現(xiàn)

    使用編程語言進行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-05-05
  • 一文詳解C++關鍵詞auto的用法

    一文詳解C++關鍵詞auto的用法

    在早期C/C++中auto的含義是:使用auto修飾的變量,是具有自動存儲器的局部變量,但遺憾的是一直沒有人去使用它,在 C++11中,auto不再是一個存儲類型指示符,而是作為一個新的類型指示符來指示編譯器,本文將給大家詳細的介紹一下C++關鍵詞auto的用法,需要的朋友可以參考下
    2024-02-02
  • C++?如何使用棧求解中綴、后綴表達式的值

    C++?如何使用棧求解中綴、后綴表達式的值

    這篇文章主要介紹了C++?使用棧求解中綴、后綴表達式的值,本文講解了中綴、后綴表達式的求值過程以及如何將一個中綴表達式轉換成后綴表達式,需要的朋友可以參考下
    2022-10-10

最新評論

郴州市| 锦屏县| 蒙阴县| 行唐县| 阳信县| 东至县| 佛坪县| 抚松县| 石嘴山市| 错那县| 嘉善县| 琼海市| 万盛区| 濮阳县| 瓦房店市| 弥渡县| 彩票| 蒙山县| 伊金霍洛旗| 苍山县| 哈尔滨市| 马尔康县| 融水| 大关县| 苍溪县| 信宜市| 鲁甸县| 于都县| 乌拉特前旗| 兴国县| 泊头市| 志丹县| 封丘县| 台中县| 和林格尔县| 新乐市| 保康县| 阿图什市| 曲麻莱县| 六枝特区| 大渡口区|