C++编译器是否为所有成员方法生成隐藏的“这个”指针,或者仅为引用成员的成员?< P>引用C++标准(草案N3242): 9.3.2该指针的指针,c++,pointers,this,C++,Pointers,This" /> C++编译器是否为所有成员方法生成隐藏的“这个”指针,或者仅为引用成员的成员?< P>引用C++标准(草案N3242): 9.3.2该指针的指针,c++,pointers,this,C++,Pointers,This" />

C++;编译器生成";这";所有成员方法的指针,还是仅用于引用成员的方法? < > C++编译器是否为所有成员方法生成隐藏的“这个”指针,或者仅为引用成员的成员?< P>引用C++标准(草案N3242): 9.3.2该指针的指针

C++;编译器生成";这";所有成员方法的指针,还是仅用于引用成员的方法? < > C++编译器是否为所有成员方法生成隐藏的“这个”指针,或者仅为引用成员的成员?< P>引用C++标准(草案N3242): 9.3.2该指针的指针,c++,pointers,this,C++,Pointers,This,1在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是调用函数的对象的地址 我想这意味着它存在于所有成员函数中。 < P>“C++编译器”可能会有很大的不同,取决于他在空间和时间上的确切点。 也就是说,大多数编译器实现类和对象的方式,这是类的每个实例的一部分。这意味着,它可以在对象的整个范围内访问。简短回答:是 更详细的回答:如果它不使用任何成员变量,为什么它首先是一个成员函数[而不是一个静态成员函数]。(是的,在某些情况下,接口提供的成员方法不处理任何成员内容,

1在非静态(9.3)成员函数的主体中,关键字this是一个prvalue表达式,其值是调用函数的对象的地址

我想这意味着它存在于所有成员函数中。

< P>“C++编译器”可能会有很大的不同,取决于他在空间和时间上的确切点。 也就是说,大多数编译器实现类和对象的方式,
这是类的每个实例的一部分。这意味着,它可以在对象的整个范围内访问。

简短回答:是

更详细的回答:如果它不使用任何成员变量,为什么它首先是一个成员函数[而不是一个静态成员函数]。(是的,在某些情况下,接口提供的成员方法不处理任何成员内容,因为它只是在打印错误类型上调用此函数的错误消息,或者它是“我们有时需要此函数”,在不需要执行任何操作的情况下,它是一个空函数)


由于我们可以在编译器不知道其实际功能的情况下使用成员函数(例如,在函数的“使用”和“定义”使用不同的源文件的情况下),因此编译器必须对所有调用遵循相同的调用约定,无论实际是否需要
指针。当然,如果代码对编译器可见,那么它可以内联函数,或者进行优化,从而在允许这样做的情况下生成更好的代码。但是,如果编译器不知道更好,则“默认”是通过<代码>这个< /C> >函数,不管它是否实际需要。

< P> C++中的每个对象都可以通过一个称为该指针的指针访问自己的地址。
this
指针是所有成员函数的隐式参数。其中as-friend函数没有
this
指针。只有成员函数具有此指针

class Interval
{
    public:
       long GetTime()
       {
           //Code
       }

       void SetTime(long value)
       {
           //Code
       }
}
假设您已经编写了此代码。编译器将自动向该指针添加指针。当您查看编译器为您的程序编写的代码时,它就会出现在您的面前

编译器将添加以下内容:

void Interval::SetTime(Interval* this, long value)

哪个C++编译器?但是,如果你的函数不访问任何成员,为什么它是成员函数?@ sftabb-我完全是C++的新成员,并且试图找出C++特性是如何实现的。C@Named:那种描述毫无意义
不能将此
视为成员,因为它允许您访问成员。它是非静态成员函数的隐藏参数,是的,是所有非静态成员函数的隐藏参数。@KerrekSB:标准没有说明任何关于对象引用、指针或其他正在传递的内容,只是在非成员函数中提供了
this
。现在在文献中,您可以读取(例如,在C++对象模型)中描述的指针传递给函数的功能,这不是标准所说的,而是实现者所做的。还请注意,在大多数(所有?)实现中,传递给函数的引用的低级实现是一个自动取消引用的指针。@KerrekSB:请注意,在原始注释中,我没有提到指针或引用,只是它是访问对象的手段。虽然这不是一个精确的描述,但我认为你不能说它不准确:)我更关心的是实际的方法参数。在C中,我手动将实例指针传递为<代码>自身> /Cux>指针,我很好奇,如果C++编译器对每个成员方法都做同样的操作,并且如果自动地支持每个单独的翻译单元,编译器就没有选择,只能为每个成员函数传递“这个”。第二段完全混淆了。问题是关于C++编译器,它必须“实现类和对象”。这“不是”类的每个实例的一部分,而是从外部传入的值。对象实际上没有作用域。@EJP 1。第二段讨论了大多数编译器实现类和对象的方式,IMHO已经暗示了它们是这样做的。2. <代码>此
定义为实例的一部分:它是对实例的引用。对实例的引用不是实例的一部分。成员是实例的一部分。引用必须来自外部,否则无法访问,因为您仍然需要引用才能访问内部引用,因此不需要内部引用。确定。我不愿意讨论,对某事物的引用不是该事物的属性。他在问实现是如何编译它的,这是标准无法回答的。我认为如果标准说每个成员函数都有一个this指针,那么符合标准的编译器首先不能忽略它。因为您甚至可以在不引用任何成员的情况下访问其中的对象地址。(这并不意味着编译器可能不会在完全不被访问的情况下对其进行优化,根据“仿佛”…但编译器应用的优化类型对编译器非常具体。)@Pixelchemist根据“仿佛”规则,它可以省略它。如果函数不使用<代码>这个< /C> >它是否存在并不影响程序的执行。@ PubBy另外他没有指定编译器,因此答案是基于所有C++编译器所共有的:标准。<代码>朋友<代码>是一个红色鲱鱼。功能不是“成员或朋友”。功能是“成员”或