學習筆記(變量&基本類型)

花了一上午看完了第二章,<<變量和基本類型>> 

回顧一下新知識:

 

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,先寫到這,喫飯鳥~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章