书中55页(第五版)写到
既然让ri引用dval,就肯定想通过ri改变dval的值,否则干什么要给ri赋值呢?如此看来,既然大家基本上不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法。
既然对某个变量的引用是为了通过该引用改变这个变量,那常量引用的意义何在?另外最后一句话“既然大家基本上不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法。”不是很明白,能不能举一个例子?
认证高级PHP讲师
除了2.4.1節(第55頁)和15.2.3節(第534頁)將要介紹的兩種例外情況,其他所有引用的類型都要和與之綁定的對象嚴格匹配。
55頁介紹的例外就是說 const 引用算一個例外,書中也舉了例子,46頁中:
double dval = 3.14; int &refVal5 = dval; //错误:此处引用类型的初始值必须是int型对象
在55頁:
double dval = 3.14; const int &ri = dval;
是可以的。
既然讓ri引用dval,就一定想透過ri改變dval的值,否則幹嘛要給ri賦值呢?如此看來,既然大家基本上不會想著把引用綁定到臨時量上,C++語言也就把這種行為歸為非法
這段話的意思就是為了說明為什麼 非const的引用是非法的(46頁例子),並不是為了說明const的常數引用的作用。這段話的開頭有句是:
接下來討論當 ri 不是常數時....
常數引用的作用,主要就是為了防止修改所引用的物件。例如你有一個 迭代器,你只希望迭代並不希望該迭代器能夠改變引用的元素對象,這時候就要用到常數引用了。
常數引用的意義在於取得值,防止值改變。 const int &i=1;等價於int j = 1;const int &i=j;
對臨時變數進行非const引用,賦值改變後無法存取被引用變量,無意義。
而const引用的一大用處在於函數傳參:void foo(const string& s);可以這樣呼叫s = “abc”;foo(s);或這樣呼叫foo(“abc”);而非const引用void foo(string &)對於後一種呼叫是非法的。
臨時變數只是暫時存在,生命期由編譯器控制,一般都是完整表達式執行完後釋放。 於是對於一個這樣臨時的東西,自然修改它沒啥意義,因為過會它就死了
Hi, 引用的一部分是替代指標的傳遞, 來達到修改外部變數的值, 而你說的常數引用是為了資料拷貝而作的最佳化,試想一下,定義了一個超長的string , 為了避免拷貝複製,就用引用, 用const 是因為避免函數內部修改
你要結合46頁來看,46頁說:
55頁介紹的例外就是說 const 引用算一個例外,書中也舉了例子,46頁中:
在55頁:
是可以的。
這段話的意思就是為了說明為什麼 非const的引用是非法的(46頁例子),並不是為了說明const的常數引用的作用。這段話的開頭有句是:
常數引用的作用,主要就是為了防止修改所引用的物件。例如你有一個 迭代器,你只希望迭代並不希望該迭代器能夠改變引用的元素對象,這時候就要用到常數引用了。
常數引用的意義在於取得值,防止值改變。
const int &i=1;
等價於
int j = 1;
const int &i=j;
對臨時變數進行非const引用,賦值改變後無法存取被引用變量,無意義。
而const引用的一大用處在於函數傳參:
void foo(const string& s);
可以這樣呼叫
s = “abc”;
foo(s);
或這樣呼叫
foo(“abc”);
而非const引用void foo(string &)對於後一種呼叫是非法的。
臨時變數只是暫時存在,生命期由編譯器控制,一般都是完整表達式執行完後釋放。
於是對於一個這樣臨時的東西,自然修改它沒啥意義,因為過會它就死了
Hi,
引用的一部分是替代指標的傳遞, 來達到修改外部變數的值, 而你說的常數引用是為了資料拷貝而作的最佳化,試想一下,定義了一個超長的string , 為了避免拷貝複製,就用引用, 用const 是因為避免函數內部修改