[关闭]
@CrazyHenry 2018-02-04T10:11:08.000000Z 字数 1198 阅读 1374

6.x 关于string的底层const和初始化

ccccC++Primer


之前有一种案例,引用的类型如果是匹配的话,不会重新拷贝一份副本作为引用的对象!

  1. const int &ri = 42;//42默认为int类型

引用的类型如果类型不匹配,就会拷贝一份作为副本!
以初始值作为构造参数,构造一个左侧类型的对象。

  1. double dl = 5.22;
  2. const int &ci = dl;

除了引用类型,其余的类型都会被拷贝一份:

  1. const char *p = "Hello";
  2. //p指针的内容(地址)是拷贝过来的!
  3. //"Hello"会被转换为char*型指针

关于string和字面量

  1. const string &s = "Hello";
  2. //字面量在很多情况下比较特殊,它虽然是数组,但是可以拷贝
  3. //以"Hello"(const char*)为构造参数,创建一个const string对象
  4. //然后该对象与s绑定!
  5. string &s = "Hello";//非法
  6. //普通引用类型必须严格匹配
  7. string s = "Hello";
  8. //这个代码似乎违背了:右侧如果有底层const,左侧必须有
  9. //但实际上,这句话只适用于类型严格匹配的情况
  10. //如果类型不匹配,则类型转换完全由类类型决定
  11. //这里,用"Hello"作为初始值,初始化一个string对象s
  12. const string *p = "Hello";//非法
  13. //指针的类型必须匹配,除了底层const在少数情况可以忽略
  14. const int *pi = pd;//pd是double *类型,error
  15. const string s = "Hello";
  16. const string *p = &s;
  17. //用"Hello"构造一个string s对象
  18. //string的底层const是string的,"Hello"的底层const是Hello的
  19. //不同类型的底层const不能互通,只有同类型的才能赋值和初始化
  20. //除了引用类型可以不匹配,他会去构造一个新的string对象
  1. char arr[] = "Hello";
  2. //类型匹配,不使用"Hello"的底层const
  3. const char *p = "Hello";
  4. //类型匹配,使用"Hello"的底层const
  5. const string s = "Hello";
  6. string s = "Hello";
  7. const char *pp = "Hello";
  8. string ss = pp;
  9. string ss2 = arr; //char *和const char*都可以初始化string
  10. //类型不匹配,不在乎"Hello"是否具有底层const,用其构造一个左侧对象
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注