形参前面有没const,这里还是有点区别的。分几个情况看看:
这样编译没有问题,如果我把第10行的const去掉,编译也没有问题。但是第10行不变,把第4行的const去掉,编译就有问题了。(引用类似,就不再说了)
知道实参如果按值传递,则形参接收的只是实参的一个拷贝,对这个拷贝的任何操作都不会去改变实参,那么此时它加不加const都是一样,所以在有这样一种情况“尽管函数的形参是const,但是编译器还是将它定义为普通的函数”,如:
void fun(const int i);
void fun(int i);
是一样的,这时会出现“重定义的错误”。
但是形参是按地址如指针或者引用的话,就另当别论了。
看个例子:
#include <iostream>
#include <string>
using namespace std;
void print_str(const char *s)
{
cout<<s<<endl;
}
int main()
{
const char *p = "hello world";
print_str(p);
return 0;
}
这样编译没有问题,如果我把第10行的const去掉,编译也没有问题。但是第10行不变,把第4行的const去掉,编译就有问题了。(引用类似,就不再说了)
那么可以首先想到,void print_str(const char *s);和void print_str(char *s);不是两个一样的函数。
可以这样想想:对于变量的约束,允许加强,但是不能削弱
若形参是const,那么实参是不是const都不要紧; 若形参不是const,那么要传递成功,则应该不是const。