您好,登錄后才能下訂單哦!
引用是什么?
引用其實就是給變量起的一個別名,使用這個別名跟使用變量名沒有區別。
那什么又是變量名呢?
變量名實質上是一段連續存儲空間的別名,是一個標號(門牌號),編譯器通過變量來申請并命名內存空間,程序員可以通過變量的名字可以使用存儲空間。
也可以這樣理解,變量名是邏輯概念,變量是物理層面,變量含數據類型和數據值,數據類型決定內存的分配,編譯器將變量名和變量對應的內存聯系起來,使程序員可以通過變量名來操作內存。
引用怎么用?
語法:Type& name = var;
規則:1、普通引用在聲明時必須用其它的變量進行初始化
2、引用作為函數參數聲明時不進行初始化(后面將通過引用本質來解釋原因)
為什么需要引用?
1)引用作為其它變量的別名而存在,因此在一些場合可以代替指針
2)引用相對于指針來說具有更好的可讀性和實用性
引用為java等高級的語言程序員提供了很大便利,其不需要了解C++中的指針,只需要按照以前的習慣來使用就可以。
引用的本質剖析(很重要!!)
1、引用其實是個常量,證明如下
大家對C++的引用應該都不陌生吧,抱著既要知其然,也要知其所以然的態度。
下面將按照是什么?怎么用?為什么需要?本質剖析的流程來向大家一一描述。
1、引用其實是個常量,證明如下
int main()
{
int a = 1;
//int& b; C++編譯器提示:錯誤“b”,必須初始化引用-->說明引用是個常量
int& b = a;
}
說明: 必須初始化引用-->說明引用是個常量
2、引用其實也是個指針,證明如下
struct
teacher
{
int
age;
//4個字節
teacher& m_techer;
};
struct
student
{
int
age;
//4個字節
short
& weight;
};
int
main()
{
cout<<
"sizeof(teacher):"
<<
sizeof
(teacher)<<endl;
/*輸出sizeof(teacher):8-->說明m_techer的
引用占4個字節*/
cout<<
"sizeof(student):"
<<
sizeof
(student)<<endl;
/*輸出sizeof(student):8-->說明weight的引
用占4個字節*/
system
(
"pause"
);
return
0;
}
說明:從上面teacher&和short&的兩個引用中占用的4個字節(32位系統),可以推斷出引用其實是個指針。
根據1、2的結論可以推斷出引用其實是個指針常量或者是常量指針,下面進一步證明。
3、引用其實是個指針常量 ,證明如下
int
main()
{
int
a =10;
int
m = 22;
int
& b = a;
&b = &m;
/*疑問: b是引用,引用是個指針,指針賦值為什么還要在取地址符&b
(因為編譯器在我們使用引用時,自動給引用披上了間接引用的外衣即:*b)編譯錯誤 “=”: 左操作數必須為左值-->引用是個指針常量,不能修改其指針的指向。*/
system
(
"pause"
);
return
0;
}
說明:引用是個指針常量。下面會說出C++編譯器是怎么在C語言的基礎上加入引用機制的。
4、C++編譯器在C語言的基礎上加入引用機制
說明: 1、聲明引用時,C語言將引用聲明的是指針常量。(為啥要初始化引用原因)
2、引用使用,C語言隱藏了對常指針自動間接引用,讓我們完全不用了解指針
3、初始化引用時,C語言隱藏了對變量的取地址符&操作,讓我們感覺是在直接給變量起別名
應用的剖析到此就結束了,下面我們來說說匿名對象吧。
什么是匿名對象
匿名對象可以理解為是一個臨時對象,一般系統自動生成的,如你的函數返回一個對象,這個對象在返回時會生成一個臨時對象。
匿名對象的生命周期(很重要!!!)
class
Cat
{
public
:
Cat()
{
cout<<
"Cat類 無參構造函數"
<<endl;
}
Cat(Cat& obj)
{
cout<<
"Cat類 拷貝構造函數"
<<endl;
}
~Cat()
{
cout<<
"Cat類 析構函數 "
<<endl;
}
};
void
playStage()
//一個舞臺,展示對象的生命周期
{
Cat();
/*在執行此代碼時,利用無參構造函數生成了一個匿名Cat類對象;執行完此行代碼,
因為外部沒有接此匿名對象的變量,此匿名又被析構了*/
Cat cc = Cat();
/*在執行此代碼時,利用無參構造函數生成了一個匿名Cat類對象;然后將此匿名變
成了cc這個實例對象,此匿名對象沒有被析構。*/
cout<<
"cc 對象好沒有被析構"
<<endl;
}
int
main()
{
playStage();
system
(
"pause"
);
return
0;
}
輸出:
Cat類 無參構造函數
Cat類 析構函數
Cat類 無參構造函數
cc 對象好沒有被析構
Cat類 析構函數
說明:1、在執行playStage( )函數中的Cat( )時,生成了一個匿名對象,執行完Cat( )代碼后,此匿名對象就此消失。這就是匿名對象的生命周期。
2、在執行playStage( )函數中Cat cc = Cat();時,首先生成了一個匿名對象,因為外部有cc對象在等待被實例化,然后將此匿名對象變為了cc對象,其生命周期就變成了cc對象的生命周期。
總結:
如果生成的匿名對象在外部有對象等待被其實例化,此匿名對象的生命周期就變成了外部對象的生命周期;
如果生成的匿名對象在外面沒有對象等待被其實例化,此匿名對象將會生成之后,立馬被析構。
說明: 必須初始化引用-->說明引用是個常量
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。