C++中重载的概念

concept of overloading in C++

本文关键字:重载 C++      更新时间:2023-10-16

情况1:您可以重载两个功能,即:

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

而在中,情况2:你不能超载两个功能:

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

我已经对这个概念进行了编码和检查,但无法找出重载变化的原因。

来自标准§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)

--结束示例]

只有最外层的const和volatile类型说明符以这种方式忽略参数类型规范;const和埋在参数类型中的易失性类型说明符规范意义重大,可用于区分重载的函数声明。特别是对于任何类型的T,"指针到T"、"指针到常量T"、和"指针到易失性T"是被认为是不同的参数类型,如"对T的引用"引用常量T"answers"引用挥发性T"

在确定函数类型时,会忽略形式参数的顶级CV资格。

(CV:constvolatile

理解它的一种方法是,形式参数的顶级CV限定不可能影响函数的调用方,也不可能影响机器代码。这只是对实施的限制。因此,给定一个声明void foo( int ),您可以使用void foo( const int )进行实现,反之亦然,如果您愿意的话。

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

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