在C ++中重载的概念

时间:2015-02-13 03:27:36

标签: c++ function oop overloading

案例1: 你可以重载两个函数,即:

void foo(int *);
void foo(const int *);
在进来的时候, 案例2: 你不能重载两个函数:

void foo(int);
void foo(const int);

我已编码并检查了这个概念,但却无法找出导致重载变化的原因。

3 个答案:

答案 0 :(得分:1)

正式参数的顶级CV资格被忽略。确定函数的类型。

(简历:constvolatile

理解它的一种方法是,正式参数的顶级CV限定无法影响函数的调用者,并且它不会影响机器代码。这只是关于实施的限制。因此,如果您愿意,可以使用void foo( int )作为声明void foo( const int ),反之亦然。

答案 1 :(得分:1)

来自标准§13.1

  

参数声明仅在 存在或不存在时有所不同   const和/或volatile是等价的 。也就是说,const和volatile   确定时,将忽略每个参数类型的类型说明符   正在声明,定义或调用哪个函数。 [例如:

typedef const int cInt;
int f (int);
int f (const int); // redeclaration of f(int)
int f (int) { /* ... */ } // definition of f(int)
int f (cInt) { /* ... */ } // error: redefinition of f(int)
  

-end example]

     

只有最外层的const和volatile类型说明符   以这种方式忽略参数类型规范;常量   和volatile类型说明符隐藏在参数类型中   规范是重要的,可用于区分   重载函数声明。特别是对于任何类型的T,    “指向T的指针”,“指向const T的指针”, 和“指向易失性T的指针” 是   被认为是不同的参数类型, 和“对T的引用”一样   “引用const T”和“引用volatile T”。

答案 2 :(得分:0)

在第二种情况下,因为整数是基本类型,intconst int按值传递,函数会复制变量。因此,函数定义是相同的。

在第一种情况下,第一个函数接受一个整数指针作为参数,而第二个函数接受一个指向常量整数的指针。这些是不同的数据类型,因为整数的值不是由指针的值复制的,因此数据通过引用传递。