C++ C+中的重载概念+;

C++ C+中的重载概念+;,c++,function,oop,overloading,C++,Function,Oop,Overloading,案例1: 您可以重载两个函数,即: void foo(int *); void foo(const int *); 在,, 案例2: 不能重载两个功能: void foo(int); void foo(const int); 我已经对这个概念进行了编码和检查,但无法找到重载变化的原因。正式参数的顶级简历资格被忽略。确定函数的类型 (CV:const或volatile) 理解它的一种方法是,形式参数的顶级CV限定不能影响函数的调用方,也不能影响机器代码。这只是对实施的限制。因此,给定一个声明v

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

void foo(int *);
void foo(const int *);
在,, 案例2: 不能重载两个功能:

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

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

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

(CV:
const
volatile


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

在第二种情况下,由于整数是基元类型,
int
const int
通过值传递,函数生成变量的副本。因此,函数定义是相同的

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

来自标准§13.1

参数声明仅在存在或不存在 常量和/或volatile是等效的。也就是说,常量和volatile 确定时忽略每个参数类型的类型说明符 正在声明、定义或调用的函数。[示例:

-[结束示例]

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


const int
作为参数本质上是冗余的,因为参数是按值传递的。与
int*
不同,您对被调用函数中的
int
所做的任何操作都不会影响其在调用者中的值。@Carey:
const
始终是冗余的,因为如果删除了
const
的所有实例,程序的工作方式将完全相同。
const
的目的是作为已知的约束条件,约束哪些值可以更改。这对程序员的帮助和对纯局部变量的帮助一样多,所以你的参数没有意义。@CareyGregory;好的,除了命名的原始
const
值外,如果删除
const
,这些名称将不会用作数组大小。但你明白了。当时和现在的区别:我喝了一杯咖啡六羟甲基三聚氰胺六甲醚。。。他举了一个例子,在这个例子中,
const
确实起到了作用。@vanza:是的。该示例不是顶级的
常量
。“因为整数是基本类型”并不重要。
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)