char str[] = "test";
char *p = str; //非常量指针,指向非常量
const char * p = str; //非常量指针,指向常量
char * const p = str; //常量指针,指向非常量
const char * const p = str; //常量指针,指向常量
const出现在星号左边,表示被指物为常量,const出现在星号右边,表示指针本身为常量指针,总结成一句话:
左定值,右定位
迭代器的底层实现是指针,当const用于修饰迭代器的时候和修饰指针类似:
std::vector<int>::iterator it = vec.begin(); //非常量指针,指向非常量
std::vector<int>::const_iterator it = vec.begin(); //非常量指针,指向常量
const std::vector<int>::iterator it = vec.begin(); //常量指针,指向非常量
const std::vector<int>::const_iterator it = vec.begin(); //常量指针,指向常量
const类成员函数重载:
class A {
public:
...
const char& operator[](std::size_t pos) const; //const型类成员函数
char& operator[](std::size_t pos); //非const型成员函数
}
以下是两种调用场景:
A obj;
obj[10] = 10; //正确,调用非const型成员函数,可以被改动
const A obj;
obj[10] = 20; //错误,调用const型成员函数,不可以被改动
还有一点要特别注意:返回类型必须是引用,如果直接返回内置类型,那么企图更改成员函数的返回值本身就是错误的做法,因为返回值是临时变量,返回后就会被释放!