【问题标题】:concept of overloading in C++C++中重载的概念
【发布时间】:2015-02-13 03:27:35
【问题描述】:

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

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

在 , 案例2: 你不能重载两个函数:

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

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

【问题讨论】:

  • const int 作为参数本质上是多余的,因为参数是按值传递的。与int * 不同,您对被调用函数中的int 所做的任何操作都不会影响其在调用者中的值。
  • @Carey: const 在某种意义上总是多余的,如果const 的所有实例都被删除,程序将照常工作。 const 的目的是作为对哪些值可以更改的已知约束。这对程序员的形式参数和纯局部变量一样有帮助,所以你的参数没有意义。
  • @CareyGregory;好吧,除了命名为原始 const 值之外,这些名称不会像例如如果 const 被删除,则数组大小。但你明白了。当时和现在的区别:我喝了一杯咖啡。 :)

标签: c++ function oop overloading


【解决方案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)

——结束示例]

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

【讨论】:

    【解决方案2】:

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

    (简历:constvolatile

    一种理解方式是,形式参数的顶级 CV 资格无法影响函数的调用者,也不会影响机器代码。这只是对实施的限制。因此,如果您需要声明 void foo( int ),您可以使用 void foo( const int ) 来实现,反之亦然。

    【讨论】:

    • 嗯...他举了一个例子,const 确实有所作为。
    • @vanza:是的。该示例不是顶级const
    【解决方案3】:

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

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

    【讨论】:

    • “因为整数是原始类型”无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多