如果是對乙個常量進行引用,則編譯器首先建立乙個臨時變數,然後將該常量的值置入臨時變數中,對該引用的操作就是對該臨時變數的操作。對常量的引用可以用其它任何引用來初始化;但不能改變。
關於引用的初始化有兩點值得注意:
(1)當初始化值是乙個左值(可以取得位址)時,沒有任何問題;
(2)當初始化值不是乙個左值時,則只能對乙個constt&
(常量引用)賦值。而且這個賦值是有乙個過程的:
首先將值隱式轉換到型別t
,然後將這個轉換結果存放在乙個臨時物件裡,最後用這個臨時物件來初始化這個引用變數。
例子:double& dr = 1; //
錯誤:需要左值
const double& cdr = 1; // ok
第二句實際的過程如下:
double temp = double(1);
const double& cdr = temp;
作函式引數時:
1結果://bc_temp_objects_not_bound_to_nonconst_ref.cpp2//
compile with: /ehsc
3 #include "
iostream"4
using
namespace
std;
5class
c {};
6void f(c & c)
7void f(c const & c)
8int
main()
c const &更直接的,用基本型別:
1 #include 2using
namespace
std;
3void display(int
const &ref)
4int
main()
5
通過常量引用從函式返回乙個區域性物件:
一般從乙個函式返回乙個區域性物件的引用是不對的:
1 t & my_op ( void) 2
//the t object t got destroyed here so the returned reference is not valid anymore.
特殊情況:返回乙個常引用
1const t & my_op ( void
) 2
1const t & my_t_obj = my_op ();
在這個情況下,區域性變數 t 不會被直接析構,而是會保留到 my_t_obj 的生命週期結束為止。
總之,常量引用語法上可以引用乙個臨時變數。這種方法在使用引用作函式引數和返回區域性變數時有意義。
我目前看來常量引用主要用在作函式引數或保證不修改原變數的時候。
一些參考:
...如果是對乙個常量進行引用,則編譯器首先建立乙個臨時變數,然後將該常量的值置入臨時變數中,對該引用的操作就是對該臨時變數的操作。對常量的引用可以用其它任何引用來初始化;但不能改變。
關於引用的初始化有兩點值得注意:
(1)當初始化值是乙個左值(可以取得位址)時,沒有任何問題;
(2)當初始化值不是乙個左值時,則只能對乙個constt&
(常量引用)賦值。而且這個賦值是有乙個過程的:
首先將值隱式轉換到型別t
,然後將這個轉換結果存放在乙個臨時物件裡,最後用這個臨時物件來初始化這個引用變數。
例子:double& dr = 1; //
錯誤:需要左值
const double& cdr = 1; // ok
第二句實際的過程如下:
double temp = double(1);
const double& cdr = temp;
作函式引數時:
c 的引用 常量引用
c 中的引用不用考慮太多解引用的東西 include using namespace std void func int ref intmain 在c 中,int ref a等價於int const ref a,也就是說ref直接存的是a的位址。但是實際上想要對ref的值進行修改的話,是不需要解引用...
C 的引用與常量
int a 10 int b a 其實在編譯時,編譯器會將 int b a 變為 int const b a 由於int const 所修飾的變數必須要賦初值,且由於const 修飾的 b 所以表示b指標是無法修改的,即b指標無法指向另乙個指標,所以這也驗證了引用必須賦初值的原因。附 關於如何引用陣...
C 中的常量引用
有指標常量和常量指標 那麼有沒有引用常量和常量引用呢?答案是,沒有引用常量 引用有常量引用和普通引用。要區分常量和常量引用的區別 引用作為形參時,形參的位址其實就是對應實參的位址 但是如果形參為常數時,則會為形參重新分配空間 常量引用的定義方式 int b const int a b 或者int b...