在我看来:这句话换种说法比较合适,引用一经初始化,他的指向就修改不了了。 为什么这么说呢,请看代码
std::string s1 = "ab";
std::string s2 = "bc";
std::string &s3 = s2;//此处s3引用s2
s3 = s1; //尝试修改指向
cout << s1 << endl;//结果是:ab
cout << s2 << endl;//结果是:ab
cout << s3 << endl;//结果是:ab
//这里你发现这不是修改指向了吗?
//是不是给你的感觉是s3修改指向,指向了s1
//其实并不是。
//请再看下面输出的结果
cout << &s1 << endl; //0x0038FAEC
cout << &s2 << endl; //0x0038FAc8
cout << &s3 << endl; //0x0038FAc8
//这里你是不是发现,s2和s3的地址是一样的
//这是为什么呢?
//再看这里:
s3 = "abcd";//修改引用对象的值
cout << s1 << endl;//ab
cout << s2 << endl;//abcd
cout << s3 << endl;//abcd
//看到这里是不是发现了什么
其实上面的s3 = s1并有修改引用的指向,只是单单的把s1的值赋值给了s3 导致s2和s3都变为ab,因为他们使用一块内存(输出地址相等),他们的值并没有发生改变。
而后面我将s3的值改变,更是证明了这一点,如果当时s3修改了指向的话,那么 s1的值应该修改为abcd,但是结果并不是。
所有在我看来:引用一经初始化,他的指向就修改不了了