C++11中的引用限定符示例代碼
C++中有左值和右值的概念。其實,左值和右值的區(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)用,運行程序會輸出兩個 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 必須位于引用限定符前面。
需要注意的一點是,當(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++ static的作用,全局變量和局部變量的區(qū)別
這篇文章介紹了C++ static的作用,全局變量和局部變量的區(qū)別,需要的朋友可以過來參考下,希望能夠給你帶來幫助2021-09-09
基于linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)
本篇文章是對linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
c++基礎(chǔ)語法:構(gòu)造函數(shù)與析構(gòu)函數(shù)
構(gòu)造函數(shù)用來構(gòu)造一個對象,主要完成一些初始化工作,如果類中不提供構(gòu)造函數(shù),編譯器會默認(rèn)的提供一個默認(rèn)構(gòu)造函數(shù)(參數(shù)為空的構(gòu)造函數(shù)就是默認(rèn)構(gòu)造函數(shù)) ;析構(gòu)函數(shù)是隱式調(diào)用的,delete對象時候會自動調(diào)用完成對象的清理工作2013-09-09

