[关闭]
@CrazyHenry 2018-01-31T16:17:47.000000Z 字数 857 阅读 1199

6.x const string &s = "Hello";

ccccC++Primer


const string &s = "Hello";

这段代码执行后,对象s和字面量"Hello"的字符是同一段内存吗?
为什么引出这个问题?因为曾经有这样的情景:

  1. const int i = 10;
  2. const int &ri = i;
  3. cout<<&i<<endl;
  4. cout<<&ri<<endl;

发现i和ri所指的同一段内存!
但是,string类型就不同了!因为string和char []本就不是同一种类型,这个时候会生成一个临时量,然后再绑定s。

  1. const char *p = "Hello";
  2. const string &s = p;
  3. cout<<&p[0]<<endl;
  4. cout<<&s[0]<<endl;
  5. cout<<s<<endl;
  6. cout<<static_cast<const void*>(p)<<endl;
  7. cout<<&s<<endl;
  8. cout<<static_cast<const void*>(&s[0])<<endl;

image.png-14.6kB

就类似曾经的这段代码:

  1. double d = 2.2;
  2. const int &ri = d;

等价于

  1. double d = 2.2;
  2. const int i = d;
  3. const int &ri = i;
  4. //这时的i和d并不是同一段内存
  5. //ri所指的内存只能通过ri获取,并且确实具有const属性,不是ri自相情愿

自相情愿

  1. int i = 10;
  2. const int &ri = i;
  3. cout<<&i<<endl;
  4. cout<<&ri<<endl;
  5. //ri与i指向同一片内存
  6. //但是ri是一厢情愿,i可以通过其他途径修改
  7. i = 80;
  8. //ri = 90;//error,不能通过ri修改
  9. cout<<ri;//显示80
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注