q1
:引用是別名,引用必須初始化。
為什麼必須被初始化呢?
q2#include
using namespace std;
int main()
int main()
{int x=5,y=10;
swap(x,y);
cout<<"after swap: x="<
引用不能為空(必須初始化),現在要想讓引用指向在堆中開闢的一塊記憶體,保險起見,可以這樣:
int* pint=new int;
if(pint!=null)
int& rint=*pint; //
從這看,引用又是個什麼東西呢?
引用這個問題困擾我很久很久了,希望在這裡能得到解答。
如果哪位兄台在網上哪個地方或者那本書上發現有講得好的,不妨推薦一下,多謝了。
**:這幾天一直在思考一些問題,就是引用變數在一些教材上的說法是乙個變數的別名,那麼引用變數本身是否占用空間呢?
比如說:(本人使用的是
vc++6.0
編譯器)
int a = 10;
int & r = a;
cout << &a << endl;
cout << &r << endl;
從上面的例子當中可以看出:它們得出的結果是相同的,這時便會有人說,r和
a所占用的記憶體空間是相同的,因為列印出來的位址是相同的。所以這些教材上對於引用變數的操作,稱之為宣告乙個引用變數,而非定義。因為教材的編寫者認為引用變數並不占用空間。
但是,如果你使用偵錯程式除錯一下,看一下彙編的**,就會產生新的迷惑了。
00401040pushebp
00401041movebp,esp
00401043subesp,48h
00401046pushebx
00401047pushesi
00401048pushedi
00401049leaedi,[ebp-48h]
0040104cmovecx,12h
00401051moveax,0cccccccch
00401056rep stosdword ptr [edi]
5:int a = 10;
00401058mov
dword ptr [ebp-4],0ah
6:int & r = a;
0040105fleaeax,[ebp-4]
00401062movdword ptr [ebp-8],eax
從這段彙編**來看,r和
a的空間並不相同,那這又怎麼解釋呢?
基於此,我得出了乙個非常合理的解釋:
如果定義(我認為引用變數占用空間,故稱之為定義)乙個引用變數,這個時候引用變數實際上在記憶體中已經申請了乙個空間,是
4個位元組的(
32bit
系統中),它本身和指標是相同的。也就是說引用和指標對於編譯器本身來說操作是相同的,只是對於使用者來說操作不同而已。
接下來又會有人問:那麼為什麼上面程式的結果列印出來的位址是相同的呢?
其實這只是編譯器給你的假象而已。當你將
r引用給了
a,當想要列印
&r的時候,編譯器會自動將其引用的物件的位址列印出來,也就是將
a的位址列印出來,這也就是它們列印結果相同的原因了。
注:以上的解釋都是本人的研究結果,並沒有經過官方的證實,如果哪為網友對此有新的看法,不吝賜教,非常感謝!
**:
三 C 引用機制
思考 對於一段連續的儲存空間只能有乙個別名嗎?肯定不是,因此我們可以給同乙個連續的儲存空間取多個別名,這就誕生了c 中的引用機制 示例 exp 1.cpp include int main int argc,char argv 執行結果 可見,a和b指向了同一記憶體塊!tip 普通引用在宣告時必須用...
R 的內部機制
在前面的章節中,我們已經學習了 r 語言的基礎功能,並且了解了如何運用向量 矩 陣 列表和資料框表示不同形式的資料,以及用內建函式解決簡單的問題。但是僅僅了解 這些功能並不能解決所有問題。現實中的資料分析通常需要對資料進行仔細的轉換和聚合,而這些操作則需要各種各樣內建的或是由擴充套件包提供的函式。為...
內部特殊引用 this
訪問物件中的成員,是通過 物件 成員 的方式訪問的,這是在物件的外部去訪問物件中成員的形式,那麼如果我想在物件的內部,讓物件裡的方法訪問本物件的屬性,或是物件中的方法去呼叫本物件的其它方法這時我們怎麼辦?因為物件裡面的所有的成員都要用物件來呼叫,包括物件的內部成員之間的呼叫,所以在php裡面給 我提...