C++中重载的概念
concept of overloading in C++
情况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:const
或volatile
)
理解它的一种方法是,形式参数的顶级CV限定不可能影响函数的调用方,也不可能影响机器代码。这只是对实施的限制。因此,给定一个声明void foo( int )
,您可以使用void foo( const int )
进行实现,反之亦然,如果您愿意的话。
在第二种情况下,因为整数是基元类型,所以int
或const int
是按值传递的,函数会复制变量。因此,函数定义是相同的。
在第一种情况下,第一个函数接收一个整数指针作为参数,而第二个函数接收指向常量整数的指针。这些是不同的数据类型,因为整数的值不是由指针的值复制的,因此数据是通过引用传递的。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 取消引用运算符不能重载