遍历链表上的各个节点

实现这一功能的函数如下
void print(const node *head)
{
const node *p;
p=head;
cout<<"链表上各个节点的数据为:\n";
while(p!=NULL){
cout<<p->data<<endl;
p=p->next;
}
cout<<endl;
}
上面的const主要起什么作用?为什么要加?去掉有没有影响啊?

void print(const node *head)
主要是保护head的作用,使得在print函数中对head不会进行改变
如果函数中没有对它操作则可以去掉,不过可读性不强
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-16
const可以去掉,加const是为了程序的安全性和稳定性。
一般在输出函数或Set等这些函数中加const限定。
const node *head是说这个函数中不能改变节点的内容!
第2个回答  2008-11-16
const的作用是不能改变p指向的地址保存的值。
第3个回答  2008-11-16
const 是一个关键字,可理解为所修饰的变量是"只读"的.作用的防止修饰的变量被意外的修改.
----------------------------------------------------------------------
具体使用方法如下:
const
被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
作用:
1>修饰输入参数
a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
2>用const修饰函数的返回值
a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
如对于: const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
//cannot convert from 'const char *' to 'char *';
正确的用法是:
const char *str = GetString();
b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.
说明:
const type m; //修饰m为不可改变
示例:
typedef char * pStr; //新的类型pStr;
char string[4] = "abc";
const char *p1 = string;
p1++; //正确,上边修饰的是*p1,p1可变
const pStr p2 = string;
p2++; //错误,上边修饰的是p2,p2不可变,*p2可变
同理,const修饰指针时用此原则判断就不会混淆了。
const int *value; //*value不可变,value可变
int* const value; //value不可变,*value可变
const (int *) value; //(int *)是一种type,value不可变,*value可变
//逻辑上这样理解,编译不能通过,需要tydef int* NewType;
const int* const value;//*value,value都不可变