当前位置: 首页 > 知识库问答 >
问题:

为什么C中的函数重载解析会考虑静态调用的非静态成员函数?

裴俊雅
2023-03-14

我想知道为什么C中的函数重载解析在调用静态方法时会考虑非静态成员函数。

我已经阅读了这里的文档,其中指出

如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象并出现在第一个之前实际参数。

因此,请考虑以下代码。

struct A {
   static void foo(int a, float b){...}
   void foo(float a, int b){...}
};

那么调用A::foo(1.f,1.f)是不明确的。

静态成员函数用于非静态函数调用的重载解析,这很有意义。

A a;
a.foo(1, 1.f); //can safely call static method

但是为什么它也是反过来做的(在调用带有Class::function的函数时考虑非静态成员函数)?为什么编译器不能简单地选择静态无效foo(int a, flow b)

共有1个答案

沈建柏
2023-03-14

为什么编译器不能简单地选择静态void foo(int a,float b)?

我对您的问题的理解是,由于非实例A::前缀,您假设语法A::foo是明确的。但是看看这个场景:

struct A {
   static void foo(int, float);
   void foo(float, int);
};

struct B : A {
   // Hide the base class foo
   void foo()
   {
      // Now explicitly call it... this is ambiguous!
      A::foo(1.f, 1.f);
   }
};

因此,前缀A::可以同时引用静态成员函数和非静态成员函数,具体取决于上下文。编译器不能假设它只引用了一个静态成员函数。

在更多的情况下,需要像a::foo这样的限定非静态成员函数调用,例如在菱形继承结构中(如果不使用虚拟继承)。这就是为什么任何成员函数都可以这样调用(即使它是不必要且没有意义的:A A;A.A::foo(1,2.f)

 类似资料:
  • 本文向大家介绍什么是C#中的静态成员函数?,包括了什么是C#中的静态成员函数?的使用技巧和注意事项,需要的朋友参考一下 静态函数只能访问静态变量。静态函数甚至在创建对象之前就已存在。 将静态函数设置为- 以下是演示静态函数用法的示例- 示例 输出结果

  • 本文向大家介绍C ++中的静态成员函数,包括了C ++中的静态成员函数的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章中,我们讨论了C ++中的静态数据成员,并讨论了可以通过成员函数访问静态数据成员,但是该函数应该是静态成员函数 静态成员函数是一种特殊的成员函数,仅用于访问静态数据成员,其他任何常规数据成员均无法通过静态成员函数访问。就像静态数据成员一样,静态成员函数也是类函数。它不与任何类

  • 在类中,static 除了可以声明 静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。 编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 th

  • 本文向大家介绍C++中静态成员函数与静态成员变量(static ),包括了C++中静态成员函数与静态成员变量(static )的使用技巧和注意事项,需要的朋友参考一下 C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习C语言的stati

  • 这个问题相当复杂,我不知道以前是否有人问过,因为我不知道如何在搜索框中表达这个问题。 下面是代码: 静态成员将在更多静态方法中再次使用,但我需要首先将其时区设置为“UTC”。有没有方法调用<code>。setTimeZone(“UTC”)一劳永逸?或者我必须调用<code>。setTimeZone(“UTC”)在每个静态方法中?

  • 这是我上一篇文章的后续文章 参考非静态成员函数 在下面 const-、vole-和ref限定的成员函数 非静态成员函数可以在没有ref限定符的情况下声明,...在重载解析期间,X类的非静态cv限定成员函数被处理如下: 无ref限定符:隐式对象参数具有对cv限定X的类型左值引用,并且还允许绑定右值隐式对象参数 为了进一步探索这一点,我试用了上面链接中提供的源代码,如下所示: 我已经在每个基于引用限定