花了一上午看完了第二章,<<变量和基本类型>>
回顾一下新知识:
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,先写到这,吃饭鸟~~~