@CrazyHenry
2018-02-04T10:11:08.000000Z
字数 1198
阅读 1374
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- 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对象s
const string *p = "Hello";//非法
//指针的类型必须匹配,除了底层const在少数情况可以忽略
const int *pi = pd;//pd是double *类型,error
const string s = "Hello";
const string *p = &s;
//用"Hello"构造一个string s对象
//string的底层const是string的,"Hello"的底层const是Hello的
//不同类型的底层const不能互通,只有同类型的才能赋值和初始化
//除了引用类型可以不匹配,他会去构造一个新的string对象
char arr[] = "Hello";
//类型匹配,不使用"Hello"的底层const
const char *p = "Hello";
//类型匹配,使用"Hello"的底层const
const string s = "Hello";
string s = "Hello";
const char *pp = "Hello";
string ss = pp;
string ss2 = arr; //char *和const char*都可以初始化string
//类型不匹配,不在乎"Hello"是否具有底层const,用其构造一个左侧对象