C++ Primer(第4版) 习题7.39
解释一下每组声明中的第二个函数声明所造成的映像,并指出哪些不合法
(b) int calc(char*, char*);
int calc(const char*, const char*);
(c) int calc(char*, char*);
int calc(char* const, char* const);
(b)中第二个声明的效果是:声明了一个重载的calc函数
(c)中第二个声明是对第一个声明的重复声明。因为当形参以副本传递(即按值传递)时,不能基于形参是否为const来实现函数重载。
const char与char const相同,都是都表示标识一个char的变量不能改变它的值,例如:
const char a = 'a'; //a变量就只能够是'a'了,不能再改变它的值
const char* p1 = &a;
char* const p2 = &a;
*p1不能改变;
p2不能改变;
主要看待究竟const是否修饰*号(即*号是否在const后面)就行,如果修饰,则代表是*p是常量,如果不修饰则p是常量。
所以char const * p与const char*相同,因为*号在const后面。
注意:常量规定是在编译时候检测的,运行时候是可以改变的,例如上面的*p1为常量,但是可以赋值p1=&b,其中b='b';那么*p1的值也会变成'b'了。
然后在回顾上面的习题:
(A) int calc(char*, char*); 形参为指针变量
(B) int calc(const char*, const char*); 形参为常量变量,指针能改变,指针所指向的变量不能改变,不同于(A)
(C) int calc(char* const, char* const); 形参为常量指针,指针不能改变,指针所指向的变量能改变,相同(A)
const char*, char const*, char*const
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。