最新Visual Studio 2010代碼的簡介與說明
在這段實現(xiàn)的Visual Studio 2010代碼中,我們使用了一個move()函數(shù)來代替對象的賦值操作符“=”,move()只是簡單地接受一個右值引用或者左值引用作為參數(shù),然后直接返回相應(yīng)對象的右值引用。這一過程不會產(chǎn)生拷貝(Copy)操作,而只會將Visual Studio 2010代碼的源對象移動(Move)到目標對象。
auto關(guān)鍵字
在C++0x中,auto關(guān)鍵字的意義發(fā)生了改變: 它可以“從初始化器(initialize)中推導(dǎo)出所代表的變量的真正類型”。這種對auto關(guān)鍵字的使用方式可以大大消除當前冗長和易出錯的代碼。在這段代碼中,我們使用auto關(guān)鍵字來代替了真正的數(shù)據(jù)類型map<string, string>::iterator,這使得整個代碼自然而簡潔。#t#
另外,跟其他數(shù)據(jù)類型一樣,我們也可以對auto關(guān)鍵字進行修飾,例如添加const,指針(*),左值引用(&),右值引用(&&)等等,編譯器會根據(jù)auto類型所代表的真正的數(shù)據(jù)來決定這些修飾的具體含義。
為了兼容一些舊有的C++代碼,我們可以使用/Zc:auto這個編譯器選項,來告訴編譯器是采用auto關(guān)鍵字的原有定義還是在新標準C++0x中的定義。
右值引用
作為最重要的一項語言特性,右值引用(rvalue references)被引入到 C++0x中。我們可以通過操作符“&&”來聲明一個右值引用,原先在C++中使用“&”操作符聲明的引用現(xiàn)在被稱為左值引用。
- template <class T> swap(T& a, T& b)
- {
- T tmp(a); // tmp對象創(chuàng)建后,我們就擁有了a的兩份拷貝
- a = b; // 現(xiàn)在我們擁有b的兩份拷貝
- b = tmp;// 現(xiàn)在我們擁有a的兩份拷貝
- }
- template <class T> swap(T& a, T& b)
- {
- T tmp(a); // tmp對象創(chuàng)建后,我們就擁有了a的兩份拷貝
- a = b; // 現(xiàn)在我們擁有b的兩份拷貝
- b = tmp;// 現(xiàn)在我們擁有a的兩份拷貝
- }
在第一行Visual Studio 2010代碼中,我們將一個臨時對象int()綁定到一個左值引用,將產(chǎn)生一個編譯錯誤。而在第二行中,我們將臨時對象綁定到右值引用,就可以順利通過編譯。右值是無名的數(shù)據(jù),例如函數(shù)的返回值一般說來就是右值。當對右值進行操作的時候,右值本身往往沒有必要保留,因此在某些情況下可以直接“移動”之。通過右值引用,程序可以明確的區(qū)分出傳入的參數(shù)是否為右值,從而避免了不必要的拷貝,程序的效率也就得到了提高。我們考慮一個簡單的數(shù)據(jù)交換的小程序,從中來體會右值引用所帶來的效率提升。我們可以寫一個函數(shù)swap來實現(xiàn)兩個變量值的交換:
- #include "stdafx.h"
- template <class T>
- T&& move(T&& a)
- {
- return a;
- }
- template <class T> void swap(T& a, T& b)
- {
- T tmp(move(a)); // 對象a被移動到對象tmp,a被清空
- a = move(b);// 對象b被移動到對象a,b被清空
- b = move(tmp); // 對象tmp被移動到對象b
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int a = 1;
- int b = 2;
- swap(a, b);
- return 0;
- }
在這段Visual Studio 2010代碼中,雖然我們只是為了進行簡單的數(shù)據(jù)交換,但是卻執(zhí)行了多次對象拷貝。這些對象的拷貝操作,特別是當這些對象比較大的時候,無疑會影響程序的效率。