构造函数是否也有隐式 this 参数

use*_*570 5 c++ constructor this language-lawyer

我正在学习 C++ 中的类,并且知道非静态成员函数具有隐式 this 参数。我的第一个问题是构造函数是否也有一个隐式的 this 参数,就像非静态成员函数一样。请注意,我并不是问我们是否可以this在 ctor 内部使用,因为我已经知道我们可以this在 ctor 内部使用。


接下来,我知道在const类的合格非静态成员函数内X, 的类型thisconst X*。对于非静态成员函数(没有 const 限定), 的类型thisX*。同样,在 ctor 内部, 的类型this始终是X*。更深层次的问题来了。

我们知道,当我们调用一个非静态成员函数(例如obj.func())时,名为的对象的地址obj会隐式传递给方法的隐式 this 参数func。所以这解释了“this非静态成员函数的来源”。

现在,让我们将同样的事情应用于构造函数。例如,假设我们X使用默认 ctor 创建一个类的对象,如下所示:

X x; //does the default ctor also have an implicit this parameter to which the address of x is passed?
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是:同样的事情也会发生在演员身上吗?就像, 的地址x被传递给默认构造函数的隐式参数。我目前的理解是,ctors 没有隐式的 this 参数。因此,当我们写入 时X x;, 的地址x不会作为参数传递,因为该对象尚未创建,因此传递其地址是没有意义的。但从标准中我们知道,在 ctor 内部我们可以使用this指针。所以我的第二个问题本质上是,如果 ctor 没有隐式参数,那么语句中的thisthe来自哪里?我们知道,在 C++ 中使用任何名称(例如变量名称)之前,我们必须对该名称进行声明。那么声明在哪里呢?编译器是否隐式声明了ctor 的情况?我的意思是,在非静态成员函数的情况下,我可以理解它们有作为隐式 this 参数的声明,但是在构造函数中会发生什么?在 ctors 内部,我们如何能够在没有声明的情况下使用该名称?thisthis->p = 0;thisthisthisthis

struct Name 
{
    private:
         int p = 0;
         int k = 0;
    void func()  //func is a non-static member function and so have an implicit this parameter
    {
        this->k = 0; // the "this" here comes from implicit this parameter
    }
    Name()
    {
      this->p = 0;  //where does the "this" comes from here since ctor don't have implicit this parameter
    }
    
};
Run Code Online (Sandbox Code Playgroud)

我的第三个问题是隐式 this 参数的概念是实现细节,还是标准说非静态成员函数将具有隐式 this 参数。

概括

  1. ctors 是否有隐式的 this 参数?第一个问题也可以表述为“医生也有隐式对象参数?”。

  2. 标准说我们可以this在ctor内部使用。但这从何this而来。例如,在非静态成员函数的情况下,我们知道this来自隐式的 this 参数,但在 ctor 的情况下,由于 ctor 没有隐式this参数,this我们可以在哪里使用它演员来自。

  3. 隐式参数的概念是this实现细节,还是标准规定所有非静态成员函数都具有隐式 this 参数,在这种情况下,实现也允许 ctor 具有隐式 this 参数。

编辑:

这个问题最重要的部分(IMO)是我们如何能够this在 ctor 中使用名称?例如当我们写:

this->p = 0; //here "this" behaves like a name
Run Code Online (Sandbox Code Playgroud)

在上面的语句中,this其行为就像一个名称。我们知道,在 C++ 中使用任何名称(例如变量名称)之前,我们必须对该名称进行声明。那么声明在哪里呢this?编译器是否隐式声明了thisctor 的情况?我的意思是,在非静态成员函数的情况下,我可以理解它们有作为this隐式 this 参数的声明,但是在构造函数中会发生什么?在 ctors 内部,我们如何能够在this没有声明的情况下使用该名称?

Cal*_*eth 2

标准中没有“隐式此参数”之类的内容。该标准将其称为“隐式对象参数”。

隐式对象参数仅与重载解析相关,它不会“成为” this。单独this定义为与成员函数具有相同的 cv 资格。

ctors 是否有隐式的 this 参数?第一个问题也可以表述为“医生也有隐式对象参数?”。

不,从[over.match.funcs]

出于重载决策的目的,静态和非静态成员函数都具有隐式对象参数,但构造函数没有。

但这从何this而来。

正在构造的对象。

隐式参数的概念是this实现细节还是标准规定所有非静态成员函数都具有隐式this参数,在这种情况下,实现也允许构造函数具有隐式 this 参数。

隐式对象参数是重载解析规则的一部分,它不影响this.

在 ctors 内部,我们如何能够在没有声明的情况下使用名称 this ?

this 不是一个名字,它是一个语言关键字。该语言在非静态成员函数中将其定义为纯右值表达式。 与同一位置的unqualified-id(命名对象)this不同,它们是泛左值表达式。

这就是语言律师的答案。话虽如此,我确实发现“隐式对象参数变成this”是一个有用的心理模型。

回想一下,构造函数(和析构函数)不能被 cv 限定,因此构造函数中没有任何东西可以区分,因此它是否存在并不重要。