C++11学习 新特性之 “=default” 、“=delete”
文章目錄
- 1、 =default 和=delete 概述
- 2、 類與默認(rèn)函數(shù)
- 3、 使用“=delete”來(lái)限制函數(shù)生成
- 4、 “=default”使用范圍
1、 =default 和=delete 概述
- =default、=delete 是C++11的新特性,分別為:顯式缺省(告知編譯器生成函數(shù)默認(rèn)的缺省版本)和顯式刪除(告知編譯器不生成函數(shù)默認(rèn)的缺省版本)。C++11中引進(jìn)這兩種新特性的目的是為了增強(qiáng)對(duì)“類默認(rèn)函數(shù)的控制”,從而讓程序員更加精準(zhǔn)地去控制默認(rèn)版本的函數(shù)。 其具體的功能和使用方法下面將一一道來(lái)。
2、 類與默認(rèn)函數(shù)
-
在講解關(guān)鍵字 default和delete 之前,先對(duì)類和類的默認(rèn)函數(shù)作下描述與說(shuō)明,從而加深對(duì)這兩個(gè)關(guān)鍵字的理解與認(rèn)知。既要知其然,也要知其所以然。C++中,當(dāng)設(shè)計(jì)與編寫一個(gè)類時(shí),若不顯著寫明,則類會(huì)默認(rèn)提供如下幾個(gè)函數(shù):
?????(1)構(gòu)造函數(shù)
?????(2)析構(gòu)函數(shù)
?????(3)拷貝構(gòu)造函數(shù)
?????(4)拷貝賦值函數(shù)(operator=)
?????(5)移動(dòng)構(gòu)造函數(shù)?????以及全局的默認(rèn)操作符函數(shù):
?????(1)operator,
?????(2)operator &
?????(3)operator &&
?????(4)operator *
?????(5)operator->
?????(6)operator->*
?????(7)operator new
?????(8)operator delete?????注:若我們?cè)陬愔袑?shí)現(xiàn)了這些版本之后,編譯器便不會(huì)生成其對(duì)應(yīng)的默認(rèn)函數(shù)版本,這時(shí)需要我們顯式的寫上其對(duì)應(yīng)的默認(rèn)函數(shù)版本。
- 編譯報(bào)錯(cuò),提示:Student.cpp: In function ‘int main(int, char**)’:Student.cpp:34:13: error: no matching function for call to ‘Student::Student()’ Student stu1;
- 例1定義了一個(gè)對(duì)象stu1,該對(duì)象將會(huì)使用Student類的無(wú)參構(gòu)造函數(shù),而該默認(rèn)構(gòu)造函數(shù)在Student類中,我們沒有顯式的說(shuō)明。因此,c++編譯器在我們提供了該函數(shù)實(shí)現(xiàn)之后是不會(huì)生成與之對(duì)應(yīng)的默認(rèn)函數(shù)版本的。在Student中我們重載了帶2個(gè)參數(shù)的構(gòu)造函數(shù),但是無(wú)參的構(gòu)造函數(shù),沒有提供,因此會(huì)報(bào)錯(cuò)。
解決辦法,在該類別中顯示的提供五參數(shù)的構(gòu)造函數(shù)
#include <iostream> using namespace std;class Student{public:Student(){} //顯示說(shuō)明Student的無(wú)參構(gòu)造函數(shù)Student(const int a,const int b) // :m_a(a) // ,m_b(b){{{m_a = a;m_b = b;}int getA()const {return m_a;}int getB()const {return m_b;}private:int m_a;int m_b; };int main(int argc,char **argv){Student stu(1,2);cout << stu.getA() << endl;//1cout << stu.getB() << endl;//2Student stu1; //編譯失敗,no matching function for call to ‘Student::Student()’return 0; }學(xué)習(xí)心得
- :m_a(a),m_b(b)是一個(gè)賦值的運(yùn)算
等效于
Student(const int a,const int b){m_a = a;m_b = b;}- 問題:以 Student(){} 這樣的方式來(lái)聲明無(wú)參數(shù)構(gòu)造函數(shù),會(huì)帶來(lái)一個(gè)問題,就是使得 其不再是 POD 類型,因此可能讓編譯器失去對(duì)這樣的數(shù)據(jù)類型的優(yōu)化功能。這是不希望看到的。因此最好使用 = default來(lái)修飾默認(rèn)構(gòu)造函數(shù)。
3、 使用“=delete”來(lái)限制函數(shù)生成
- C++開發(fā)中,我們經(jīng)常需要控制某些函數(shù)的生成。在C++11之前,經(jīng)常的普遍做法是將其聲明為類的 private 成員函數(shù),這樣若在類外這些這些函數(shù)的操作時(shí)候,編譯器便會(huì)報(bào)錯(cuò),從而達(dá)到效果。如例2:
- 例2代碼編譯報(bào)錯(cuò),因?yàn)樵陬愔?#xff0c;我們將Student的拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù)都聲明為了 private 屬性,因此,當(dāng)在類外使用拷貝構(gòu)造和拷貝賦值操作值,編譯器會(huì)報(bào)錯(cuò)。雖然能夠達(dá)到效果,但是不夠直觀和簡(jiǎn)潔。對(duì)于追求高效以及簡(jiǎn)潔來(lái)說(shuō)
這樣做有2個(gè)問題:
?????(1)不是最簡(jiǎn)化;
?????(2)對(duì)于友元支持不友好
更為簡(jiǎn)潔直觀的方法是使用: =delete
#include<iostream> using namespace std; class Student {public:Student() = default;Student(const int a,const int b):m_a(a),m_b(b){}int getA()const{return m_a;}int getB()const{return m_b;}Student(const Student& ) = delete;Student& operator =(const Student& ) = delete;private:int m_a;int m_b; };int main(int argc,char **argv) {Student stu(1,2);cout<<stu.getA()<<endl; //1cout<<stu.getB()<<endl; //2//Student stu1(stu);//報(bào)錯(cuò):Student.cpp:39:21: error: use of deleted function ‘Student::Student(const Student&)’//Student(const Student& );//Student stu1(3,4);//stu1 = stu;//報(bào)錯(cuò):SStudent.cpp:44:10: error: use of deleted function ‘Student& Student::operator=(const Student&)’std::cout<<is_pod<Student>::value<<std::endl; //return 0; }4、 “=default”使用范圍
- "=default"不僅僅局限于類的定義內(nèi),也可以用于類的定義外來(lái)修飾成員函數(shù),如例3:
- Student& Student::operator =(const Student& ) = delete;
參考鏈接
- C++11新特性之 “=default” 、“=delete”
總結(jié)
以上是生活随笔為你收集整理的C++11学习 新特性之 “=default” 、“=delete”的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git大文件拷贝代码命令
- 下一篇: 信用卡逾期还款记录怎么查?两种渠道都能查