学习笔记(变量&基本类型)

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

回顾一下新知识:

 

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,先写到这,吃饭鸟~~~

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