c++中的重载

  出现在相同作用域的二个函数如果具有相同的名字而形参不同,则称为重载函数。

在这个定义中有二个注意点:

1.是在相同的作用域,如果,不在相同的作用域,即使形参不同zhe,也不算作是重载函数:

比如一下的例子:

void print(const string &s)

 void print(double d)
 void f(int value)
 {
  void print(int t)
  print("value");
  print(value);
  print(3.14);
 }
在f()函数中的几个调用print()函数的,只有第二个和第三个可以执行成功,第三个是进行了类型转化,将3.14转化为了3,而第一个函数就会报错,因为,编译器就会将print()函数认为是在函数内部的这个print,这样过来就算是把不在同一个作用域中的另外二个print()函数屏蔽了。
2.是函数名相同,形参不同。形参不同可以是参数的个数,也可以是参数的类型,但是,如果二个函数的参数相同,即使返回类型不同,也不能称为重载函数。
3.当二个函数的形参的区别只是有无const的限定,这样的,只有当形参是引用或者指针时,const修饰的形参与没有修饰的可以构成是重载,其余的基本类型的,有无const修饰,形参的本质是一样的。
如下:
int f(int s);
int f(const int s);
这二个函数不构成重载,因为,这样的函数的传参是一样的,都是实参的副本,所以,实际上是没有影响到实参的,这样过来,假如,你在调用时写的是int n=9;f(n);这样函数是分不清该调用哪个函数,出现了二义性,第二个f函数中的const只是将实参的副本标记为了只读的,你可以玩这二个函数中传入int型的,也可以是const int 型的数据。但是,当参数是引用或者指针时就不一样了。因为,引用和指针都是将实参的数据传给函数,而不是复制,所以,这样的话,会影响到真正的实参的值。看下面的这个例子:
#include<iostream>
using namespace std;
void f(int &x)
 {
  cout<<x<<endl;
 }
void f(const int &x)
{
 cout<<x<<endl;
}
int main()
{
 int c=2;
 const int cc=3;
 f(c);
 f(cc);
 return 0;
}
这个的输出结果是:2 3;有这个可见:虽然,c可以作为第二个函数的参数,但是,编译器没有这样干,它将没有const修饰的实参给了没有const修饰的形参函数。
注意,这儿的指针时,const修饰的是指针指向的数据,并非,指针的值是只读的。


猜你喜欢

转载自blog.csdn.net/daydayup_666/article/details/78032674