const 位于返回类型前,表明返回对象为常量,不可改变。
如果修饰指向常量的指针。
1 const char * const helpFun()
2 {
3 char * p =new char[3];
4 p[0]='a';
5 p[1]='b';
6 p[2]='\0';
7 return p;
8 }
9
10 int main()
11 {
12 const char * p = helpFun();
13 p++;
14 cout<<p<<endl;
15 delete p;
16 return 0;
17 }
如果通过函数来创建常字符串,除了在main 函数中约束之外,也可以在函数返回类型中约束,第一行中左边的const 约束了返回的是常字符串的指针索引,因为它的存在12行必须声明为 const char *p,如果第一行左边const 不存在,那么12行可以加可以不加const,这样约束常字符串的效果只能在main 中反映,不能很好的表达调用函数的功能。
同时第一行中的第二个const 加了也无效,其约束的是一个由 char * p 转变为 char * const 的隐藏指针,该隐藏指针的指向值赋予给main 函数中的p,所以后者可以修改指向。
const位于方法参数列表后,如 void test() const;
此种情况表明,此方法不会改变调用对象的状态,保证了调用对象的常量性。
const修饰成员函数的两个作用
在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
除此之外,在类的成员函数后面加 const 还有什么好处呢?
“获得能力:可以操作常量对象”,其实应该是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。
对于const成员函数,"不能修改类的数据成员,不能在函数中调用其他不是const的函数",这是由const的属性决定的 。