C ++这个指针,在函数调用隐藏的参数(C++ this pointer, hidden argum

2019-07-21 06:54发布

我有成员Stack类和一个名为推送功能。

class STACK
{
    int data;
    public:
    void push(int x)
    {
        data=x;
    }
}

是什么c + +做这个声明转换:

s1.push(3);

s1.push(this,3);

基本上我的问题是引擎盖下会发生什么,生成this指针,把它作为一个隐藏的参数?

其实我在C编码我的目标是有一个程序,它是接近OOP越好。 为此,我有函数指针作为结构的成员。 因此,我想知道是否有可能以某种方式有跟踪哪些结构调用的函数(如“this”指针)。 我不想做这样的事情:s1.push(s1,3); 因为被它打败了我的目的。

是否有可能转换s1.push(3); 到s1.push(1,3); 经由宏替换

Answer 1:

首先第一件事情! 该声明:

s1.push(3);

是不是翻译为:

 s1.push(this, 3);

但是,为了这样的事情:

STACK::push(&s1, 3); 

其中STACK::push可视为全球/或命名空间下的类/命名空间的静态函数STACK ,它的原型是:

push(STACK const* pThis, int arg);

this指针总是第一个参数的方法(功能)。 如果方法具有零的说法,它仍然有一个参数( this指针类的)。



Answer 2:

有没有神奇

s1.push(3);

是刚刚语法

STACK::push(&s1, 3);


Answer 3:

this = &s1

S1的地址是已知的,因此它可以通过堆叠::推。 就这么简单:)



Answer 4:

C ++不完全转换报表(因为C ++是一门语言规范,你可以实现在许多方面是语言,甚至在纸上工作的奴隶人口-unethically-,你并不需要一台电脑,即使你想一个,有C ++)。 编译器(如GCC)转换语句的一些其他低层表示。 与海湾合作委员会,这是GIMPLE语句,GIMPLE表示可以进行检查,例如用MELT的探头或-fdump树,GIMPLE和其他选项(如-fdump-tree-all-fdump-tree-ssa等...)



Answer 5:

不幸的是,你必须明确或隐含指定C.指针

对于C ++,它是编译器的责任来设置隐含this指针作为一个类成员函数的参数。 在你的代码中,成员函数错位为void STACK::push(STACK*, int)由编译器自动编译,那么,当成员函数STACK::push被调用时,编译器将设置目标地址( this )作为参数(通常是第一一个)成员函数STACK::push

没有C编译器将提供上述功能,因此,它是用户的责任来设置指针。



Answer 6:

您的编辑后,这个问题占用了另一个问题 - 在OOP C.这是困难的,类型不安全,但有可能实现。 你可以看一下GObject的库,它提供了对象系统C.我想这是大量使用宏。



文章来源: C++ this pointer, hidden argument in function calls
标签: c++ this