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

C++中關(guān)于=default和=delete問題

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

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

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

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

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

以下代碼演示了如何創(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;
} 

在這里插入圖片描述

在上面的例子中,我們不必指定構(gòu)造函數(shù)A()的主體,因?yàn)橥ㄟ^附加說明符’= default’,編譯器將創(chuàng)建此函數(shù)的默認(rèn)實(shí)現(xiàn)。

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

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

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

// 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; 
} 

運(yùn)行結(jié)果:

在這里插入圖片描述

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

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

以下幾點(diǎn)做了一定的解釋:

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

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

再來說一下Deleted Function

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

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

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

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

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

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

禁用拷貝構(gòu)造函數(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ù)轉(zhuǎn)換

// 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)的,這一點(diǎn)非常重要。

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

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

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

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

// 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ù)。(如“禁用拷貝構(gòu)造函數(shù)”示例中所示)。

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

總結(jié)

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

相關(guān)文章

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

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

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

    C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理

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

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

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

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

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

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

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

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

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

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

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

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

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

    一文詳解C++關(guān)鍵詞auto的用法

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

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

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

最新評論

且末县| 雅江县| 五家渠市| 朝阳市| 石台县| 营口市| 沙湾县| 绥阳县| 个旧市| 武功县| 新兴县| 德庆县| 夹江县| 奉贤区| 八宿县| 溆浦县| 论坛| 平江县| 丰台区| 马尔康县| 罗甸县| 乌拉特后旗| 弥渡县| 武鸣县| 莎车县| 五华县| 皋兰县| 河津市| 江西省| 扬中市| 台山市| 德令哈市| 蛟河市| 岳阳县| 万宁市| 屯门区| 平遥县| 锡林郭勒盟| 邛崃市| 庄浪县| 游戏|