花了一上午看完了第二章,<<變量和基本類型>>
回顧一下新知識:
A.初始化方式:
複製初始化(copy-initialization): int ival = 1024;
直接初始化(direct-initialization): int ival(1024);
相對於C來說,直接初始化是C++裏新出現的,我的理解是爲了更好的使用類類型而設計的.類的初始化需要用已定義的構造函數進行,那麼direct-initial 方式就類似於一個函數調用,用來進行類對象的初始化.
B.引用(reference)
新東東,C中的引用操作符(&)作用是取變量的地址.C++中似乎升級了,在這裏,"引用是一種複合類型,是指用其他類型定義的類型"(P51(C++ primer 第51頁,下同)).不過我想實質還是一樣的,仍然是指向所引用對象的地址.
for example:
int ival = 1024;
int &ref_ival = ival;
引用只是它綁定對象的另外一個名字,作用在引用上的所有操作都會作用在該引用綁定的對象上.
通過 std::cout << &ival << " " << &ref_ival << std::endl;
發現二者地址相同,果然沒錯,跟C裏如出一轍.
那麼
int &ref_ival = 10; // constant
int &ref_ival; //empty
非法就好理解了,由於引用的是對象的地址,所以第一例常量錯,第二例對象空,也錯.
來看看const引用:
const int val = 1024;
const int &ref_val = val;
這個好理解,都存放在只讀存儲區,不可改變. 如果這樣: int &ref_val = val; 就錯了,val是不可改變的,用ref_val能夠改變val的值.
那麼:
int val = 1024;
const int &ref_val = val;
作用:val自己可以改變,而通過ref_val則無法改變val的值,也許在某些特殊場合能夠用到這個特性.
另外, P52有言曰: "const引用可以初始化爲不同類型的對象或者初始化爲右值",那麼:
int i = 40;
const int &ref_val1 = 1024; //constant
const int &ref_val2 = ref_val1 + i;
是合法的.
double dval = 3.14;
const int &ref_dval = dval;
也是合法的,並且:不能修改ref_dval.也就是說ref_dval保存了最初的dval值.
不過,通過程序驗證發現一個有趣的現象:
程序1:
#include <iostream>
int main()
{
int val = 1024;
const int &ref_val = val;
val++;
std::cout << val << " " << ref_val << std::endl;
std::cout << &val << " " << &ref_val << std::endl;
return 0;
}
輸出: 1025 1025
0012FF7C 0012FF7C
說明在引用類型跟被引用對象類型的類型一致時,二者引用統一地址的內容,所以其值都相同
但是: 程序2:
#include <iostream>
int main()
{
double val = 1.024;
const int &ref_val = val;
val++;
std::cout << val << " " << ref_val << std::endl;
std::cout << &val << " " << &ref_val << std::endl;
return 0;
}
輸出: 2.024 1
0012FF78 0012FF70
當引用類型跟被引用對象類型的類型不一致時,二者引用不同地址的內容,所以其值不一定相同(取決於是否有改變),那麼這個時候,引用對象的地址不是原對象地址,而是取原對象內容進行類型改變後,存儲到另外一個地址了,不論原對象如何改變,引用對象的值始終不變(但引用對象的值並不是原對象的初始值).那麼,先前所說的引用(&)地址相同的論斷就不合適了.需要因地制宜.
總結:看來,當const引用不同類型對象時的處理方式是不同的
OK,先寫到這,喫飯鳥~~~