通常,我們在乙個物件上呼叫成員函式,而不管該物件是乙個左值還是乙個右值。例如∶
string s1 = "a value",s2 = "another";
auto n = (s1 + s2).find('a');
此例中,我們在乙個string右值上呼叫find成員,該string右值是通過連線兩個 string 而得到的。有時,右值的使用方式可能令人驚訝∶
s1 + s2 = "wow!";
此處我們對兩個 string 的連線結果——乙個右值,進行了賦值。
在舊標準中,我們沒有辦法阻止這種使用方式。為了維持向後相容性,新標準庫類仍然允許向右值賦值。但是,我們可能希望在自己的類中阻止這種用法。
在此情況下,我們希望強制左側運算物件(即,this 指向的物件)是乙個左值。
我們指出this的左值/右值屬性的方式與定義const成員函式相同,即,在引數列表後放置乙個引用限定符(reference qualifier)∶
class foo ;
foo& foo::operator=(const foo &rhs) &
引用限定符可以是&或&&,分別指出this可以指向乙個左值或右值。
類似const 限定符,引用限定符只能用於(非static)成員函式,且必須同時出現在函式的宣告和定義中。對於&限定的函式,我們只能將它用於左值;
對於&s限定的函式,只能用於右值∶
foo &retfoo (); // 返回乙個引用; retfoo呼叫是乙個左值
foo retval (); // 返回乙個值; retval 呼叫是乙個右值
foo i,j; // i和j是左值
i = j; // 正確∶ i是左值
retfoo()= j; // 正確∶ retfoo()返回乙個左值
retval()= j; // 錯誤∶ retval()返回乙個右值
i = retval(); // 正確∶ 我們可以將乙個右值作為賦值操作的右側運算物件
乙個函式可以同時用 const和引用限定。在此情況下,引用限定符必須跟隨在 const限定符之後∶
class foo {
public:
foo somemem () & const; // 錯誤∶ const 限定符必須在前
foo anothermem() const &; // 正確∶ const 限定符在前
);
const限定符和引用和typedef
1.定義const物件 const int i 10 變數i仍然是乙個左值,但是現在這個左值是不可修改的,任何修改i的嘗試都會導致編譯出錯。2.const物件預設為檔案的區域性變數 非const變數預設為extern。要使const變數能夠在其他的檔案中訪問,必須顯示的指定它為extern。3.引用...
正則邊界符 限定符
正規表示式的邊界符 開始 寫在正在表示式的始位置 結束 寫在正在表示式的結束置 let str 1a123456abcdefg1 獨立使用只要包含數字,返回值就是true let reg1 d let bool1 reg1.test str console.log bool1 true 新增邊界符 ...
關於const 限定符
很多引用自c primer一書 比如有時候需要將乙個文字中的資料複製到另外乙個文字。我們需要使用緩衝區,緩衝區的大寫我們可以自己來決定比如1024個位元組,這是乙個常量,我們使用bufsize 1024.但是bufersize物件本身是乙個變數。所以我們可以引入const限定符,它將乙個物件轉化為常...