C++11中的引用限定符示例代碼
C++中有左值和右值的概念。其實(shí),左值和右值的區(qū)分也同樣適用于類對(duì)象,本文中將左值的類對(duì)象稱為左值對(duì)象,將右值的類對(duì)象稱為右值對(duì)象。
1. C++11:引用限定符
默認(rèn)情況下,對(duì)于類中用 public 修飾的成員函數(shù),既可以被左值對(duì)象調(diào)用,也可以被右值對(duì)象調(diào)用。舉個(gè)例子:
#include <iostream> using namespace std; class demo { public: demo(int num):num(num){} int get_num(){ return this->num; } private: int num; }; int main() { demo a(10); cout << a.get_num() << endl; cout << move(a).get_num() << endl; return 0; }
可以看到,demo 類中的 get_num() 成員函數(shù)既可以被 a 左值對(duì)象調(diào)用,也可以被 move(a) 生成的右值 demo 對(duì)象調(diào)用,運(yùn)行程序會(huì)輸出兩個(gè) 10。
某些場(chǎng)景中,我們可能需要限制調(diào)用成員函數(shù)的對(duì)象的類型(左值還是右值),為此 C++11 新添加了引用限定符。所謂引用限定符,就是在成員函數(shù)的后面添加 "&" 或者 "&&",從而限制調(diào)用者的類型(左值還是右值)。修改上面程序如下:
#include <iostream> using namespace std; class demo { public: demo(int num):num(num){} int get_num()&{ return this->num; } private: int num; }; int main() { demo a(10); cout << a.get_num() << endl; // 正確 //cout << move(a).get_num() << endl; // 錯(cuò)誤 return 0; }
和之前的程序相比,我們僅在 get_num() 成員函數(shù)的后面添加了 "&",它可以限定調(diào)用該函數(shù)的對(duì)象必須是左值對(duì)象。因此第 17 行代碼中,move(a) 生成的右值對(duì)象是不允許調(diào)用 get_num() 函數(shù)的。
同理,我們?cè)俅涡薷某绦颍?/p>
#include <iostream> using namespace std; class demo { public: demo(int num):num(num){} int get_num()&&{ return this->num; } private: int num; }; int main() { demo a(10); //cout << a.get_num() << endl; // 錯(cuò)誤 cout << move(a).get_num() << endl; // 正確 return 0; }
和先前程序不同的是,get_num() 函數(shù)后根有 "&&" 限定符,它可以限定調(diào)用該函數(shù)的對(duì)象必須是一個(gè)右值對(duì)象。
注意:引用限定符不適用于靜態(tài)成員函數(shù)和友元函數(shù)。
2. const和引用限定符
我們知道,const 也可以用于修飾類的成員函數(shù),我們習(xí)慣稱為常成員函數(shù),例如:
class demo{ public: int get_num() const; }
這里的 get_num() 就是一個(gè)常成員函數(shù)。const 和引用限定符修飾類的成員函數(shù)時(shí),都位于函數(shù)的末尾。C++11 標(biāo)準(zhǔn)規(guī)定,當(dāng)引用限定符和 const 修飾同一個(gè)類的成員函數(shù)時(shí),const 必須位于引用限定符前面。
需要注意的一點(diǎn)是,當(dāng) const && 修飾類的成員函數(shù)時(shí),調(diào)用它的對(duì)象只能是右值對(duì)象;當(dāng) const & 修飾類的成員函數(shù)時(shí),調(diào)用它的對(duì)象既可以是左值對(duì)象,也可以是右值對(duì)象。無(wú)論是 const && 還是 const & 限定的成員函數(shù),內(nèi)部都不允許對(duì)當(dāng)前對(duì)象做修改操作。
舉個(gè)例子:
#include <iostream> using namespace std; class demo { public: demo(int num,int num2) :num(num),num2(num2) {} //左值和右值對(duì)象都可以調(diào)用 int get_num() const &{ return this->num; } //僅供右值對(duì)象調(diào)用 int get_num2() const && { return this->num2; } private: int num; int num2; }; int main() { demo a(10,20); cout << a.get_num() << endl; // 正確 cout << move(a).get_num() << endl; // 正確 //cout << a.get_num2() << endl; // 錯(cuò)誤 cout << move(a).get_num2() << endl; // 正確 return 0; }
到此這篇關(guān)于C++11中的引用限定符的文章就介紹到這了,更多相關(guān)C++11 引用限定符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)
在C語(yǔ)言中,時(shí)間和日期處理是一項(xiàng)非常基礎(chǔ)的技能,也是開(kāi)發(fā)實(shí)際應(yīng)用程序時(shí)經(jīng)常會(huì)用到的功能,本文為大家總結(jié)了C語(yǔ)言中一些常用的時(shí)間庫(kù)函數(shù),希望對(duì)大家有所幫助2023-06-06基于Matlab實(shí)現(xiàn)中國(guó)象棋的示例代碼
中國(guó)象棋是起源于中國(guó)的一種棋,屬于二人對(duì)抗性游戲的一種,在中國(guó)有著悠久的歷史。由于用具簡(jiǎn)單,趣味性強(qiáng),成為流行極為廣泛的棋藝活動(dòng)。本文將利用Matlab實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-02-02vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了vc中float與DWORD的互想轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-06-06visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程
這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9安裝教程,以及在visualstudio 2013中opencv的配置步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04C語(yǔ)言菜鳥基礎(chǔ)教程之for循環(huán)
c語(yǔ)言中的for循環(huán)語(yǔ)句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語(yǔ)句.2017-10-10c語(yǔ)言讀取txt文件內(nèi)容簡(jiǎn)單實(shí)例
在本篇文章里小編給大家整理的是關(guān)于c語(yǔ)言如何讀取txt文件內(nèi)容,需要的朋友們可以參考下。2020-03-03