C++11中的引用限定符示例代碼
C++中有左值和右值的概念。其實(shí),左值和右值的區(qū)分也同樣適用于類對象,本文中將左值的類對象稱為左值對象,將右值的類對象稱為右值對象。
1. C++11:引用限定符
默認(rèn)情況下,對于類中用 public 修飾的成員函數(shù),既可以被左值對象調(diào)用,也可以被右值對象調(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; return 0; }
可以看到,demo 類中的 get_num() 成員函數(shù)既可以被 a 左值對象調(diào)用,也可以被 move(a) 生成的右值 demo 對象調(diào)用,運(yùn)行程序會輸出兩個 10。
某些場景中,我們可能需要限制調(diào)用成員函數(shù)的對象的類型(左值還是右值),為此 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; // 錯誤 return 0; }
和之前的程序相比,我們僅在 get_num() 成員函數(shù)的后面添加了 "&",它可以限定調(diào)用該函數(shù)的對象必須是左值對象。因此第 17 行代碼中,move(a) 生成的右值對象是不允許調(diào)用 get_num() 函數(shù)的。
同理,我們再次修改程序:
#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; }
和先前程序不同的是,get_num() 函數(shù)后根有 "&&" 限定符,它可以限定調(diào)用該函數(shù)的對象必須是一個右值對象。
注意:引用限定符不適用于靜態(tài)成員函數(shù)和友元函數(shù)。
2. const和引用限定符
我們知道,const 也可以用于修飾類的成員函數(shù),我們習(xí)慣稱為常成員函數(shù),例如:
class demo{ public: int get_num() const; }
這里的 get_num() 就是一個常成員函數(shù)。const 和引用限定符修飾類的成員函數(shù)時,都位于函數(shù)的末尾。C++11 標(biāo)準(zhǔn)規(guī)定,當(dāng)引用限定符和 const 修飾同一個類的成員函數(shù)時,const 必須位于引用限定符前面。
需要注意的一點(diǎn)是,當(dāng) const && 修飾類的成員函數(shù)時,調(diào)用它的對象只能是右值對象;當(dāng) const & 修飾類的成員函數(shù)時,調(diào)用它的對象既可以是左值對象,也可以是右值對象。無論是 const && 還是 const & 限定的成員函數(shù),內(nèi)部都不允許對當(dāng)前對象做修改操作。
舉個例子:
#include <iostream> using namespace std; class demo { public: demo(int num,int num2) :num(num),num2(num2) {} //左值和右值對象都可以調(diào)用 int get_num() const &{ return this->num; } //僅供右值對象調(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; // 錯誤 cout << move(a).get_num2() << endl; // 正確 return 0; }
到此這篇關(guān)于C++11中的引用限定符的文章就介紹到這了,更多相關(guān)C++11 引用限定符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)日期和時間處理的常用函數(shù)總結(jié)
在C語言中,時間和日期處理是一項(xiàng)非常基礎(chǔ)的技能,也是開發(fā)實(shí)際應(yīng)用程序時經(jīng)常會用到的功能,本文為大家總結(jié)了C語言中一些常用的時間庫函數(shù),希望對大家有所幫助2023-06-06基于Matlab實(shí)現(xiàn)中國象棋的示例代碼
中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強(qiá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的配置步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04