@CrazyHenry
2018-02-04T02:11:08.000000Z
字数 1198
阅读 1646
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_yingmin@outlookdotcom- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
之前有一种案例,引用的类型如果是匹配的话,不会重新拷贝一份副本作为引用的对象!
const int &ri = 42;//42默认为int类型
引用的类型如果类型不匹配,就会拷贝一份作为副本!
以初始值作为构造参数,构造一个左侧类型的对象。
double dl = 5.22;const int &ci = dl;
除了引用类型,其余的类型都会被拷贝一份:
const char *p = "Hello";//p指针的内容(地址)是拷贝过来的!//"Hello"会被转换为char*型指针
关于string和字面量
const string &s = "Hello";//字面量在很多情况下比较特殊,它虽然是数组,但是可以拷贝//以"Hello"(const char*)为构造参数,创建一个const string对象//然后该对象与s绑定!string &s = "Hello";//非法//普通引用类型必须严格匹配string s = "Hello";//这个代码似乎违背了:右侧如果有底层const,左侧必须有//但实际上,这句话只适用于类型严格匹配的情况//如果类型不匹配,则类型转换完全由类类型决定//这里,用"Hello"作为初始值,初始化一个string对象sconst string *p = "Hello";//非法//指针的类型必须匹配,除了底层const在少数情况可以忽略const int *pi = pd;//pd是double *类型,errorconst string s = "Hello";const string *p = &s;//用"Hello"构造一个string s对象//string的底层const是string的,"Hello"的底层const是Hello的//不同类型的底层const不能互通,只有同类型的才能赋值和初始化//除了引用类型可以不匹配,他会去构造一个新的string对象
char arr[] = "Hello";//类型匹配,不使用"Hello"的底层constconst char *p = "Hello";//类型匹配,使用"Hello"的底层constconst string s = "Hello";string s = "Hello";const char *pp = "Hello";string ss = pp;string ss2 = arr; //char *和const char*都可以初始化string//类型不匹配,不在乎"Hello"是否具有底层const,用其构造一个左侧对象
