函数的重载和重复声明的区别:
void a(const int a)
{
cout<<"const"<<endl;
}
void a(int a)
{
cout<<"no const"<<endl;
}
这样是重复声明,因为复制形参时并不考虑形参是否为const,函数操作的只是副本。函数无法修改实参。结果,既可以将
const对象传给const形参,也可以传给非const形参,两种形参并无本质区别。
void a(const int& a)
{
cout<<"const"<<endl;
}
void a(int& a)
{
cout<<"no const"<<endl;
}
这样是函数重载,因为函数void a(int& a)不能传递const int&类型的参数,只能传递int&类型的参数,而void a(const int& a)即可以传递const int&类型的参数也可以传递int& 类型的参数。这么看来好像只定义void a(const int& a)就够了,但是其实void a(int& a)函数还是能完成void a(const int& a)所不能完成的任务的:当int& 类型传进void a(const int& a)函数体内时,int& 的值就不能修改了,尽管它是const类型的,而void a(int& a)函数就允许在函数体内修改值。所以这两个函数还是不一样。类似的。如果函数带有指向const类型的指针的形参则与带有指向相同类型的非const对象的指针形参的函数是不同的。
结论:仅当形参是引用或指针时,形参是否为const才有影响