const限定词:
顶层const:直接作用在对象上,使得对象是一个常量。
底层const:对于复合类型,例如指针。一个指针是常量指针还是一个指向常量的指针,有区别。例如const int *p 底层const,表明p指向一个常量,不可以通过p来改变p指向的对象的值。int const *p 顶层const, 表明是一个常量指针,初始化后就不能变了。永远指向那个地址。(因为此时对象就是指针了,所以表明指针的就是顶层,表明指针所指的就是底层。)
常量引用:不可以通过常量引用来修改绑定的值,但是初始化可以用非常量来初始化。这个对于作为函数形参的时候就很重要了。当常量的引用作为函数形参,由于顶层const,实参初始化形参忽略掉顶层const, 所以传入的可以是常量或者非常量。典型书本函数
string::size_type find_char(const string &s, const char &c, string::size_type &occures) {
auto ret = s.size();
occures = 0;
for(decltype(ret) i = 0; i != s.size(); ++i) {
if(s[i] == c) {
if(ret == s.size())
ret = i;
++occures;
}
}
return ret;
}
这样可以接受形如find_char("hello wordl, ‘c’, ret),这样的参数
如果代码修改成
string::size_type find_char(string &s, const char &c, string::size_type &occures) {
auto ret = s.size();
occures = 0;
for(decltype(ret) i = 0; i != s.size(); ++i) {
if(s[i] == c) {
if(ret == s.size())
ret = i;
++occures;
}
}
return ret;
}
find_char("hello wordl, ‘c’, ret),是错误的,s只能接受一个对象,不能接受一个常量。