还记得大一刚学指针,引用这些的时候加上const被搞得有点头晕,总是当时记得,过段时间就忘了,断断续续,没理解透,,,
今天整理了一下,把自己的理解俸上。
什么是底层const?
1.底层const是与引用或指针等复合类型的基本类型相关的const,对应的就有顶层const,顶层const 就是任意的对象是常量。
狭隘的理解:底层const表示指针指向的对象是常量,而顶层const就是指针本身是常量。
2.对于底层const要特别小心,可以这样去理解:
底层const的指针或引用,仅仅是指针或引用自己觉得自己指向了一个常量,所以自觉的不去改变所指向对象的值。const属性即常量属性在通过改变所指对象的时候体现出来,编译就会出错。它的本质就是只读的。
const形参和实参
1.实参初始化形参时会忽略掉顶层const:
例如:
const int i = 1; int j = 2;
void fun(const int){}
i 和j都可以传给形参,顶层const自动忽略了。所以,注意:void fun(const int) 和void fun(int)是一样的!
2.可以使用非常量去初始化一个底层对象,但是反过来,用一个底层对象去初始化一个非常量就会出错。
注意:
这里的非常量是指去掉const属性的对象,比如 对于const int *p ,int*p1就是非常量,int p2就不是;
对于 const string & s, string &s1才是非常量,而string s2就不是我们讨论的非常量。
#include<iostream>
#include<string>
using namespace std;
int main(int argc, char* argv[])
{
string s1 = "hello";
const string & s2= s1; //s2是s1的常量引用
const string & s = s2; //可以
//string &s = s2; // 底层对象s2 初始化 同为引用的非常量对象s 会报错
string s3 = s2; //这是可以的!!!
cout<<s3<<endl;
cout<<s<<endl;
return 0;
}