C ++这个指针,在函数调用中隐藏参数

时间:2013-03-10 12:34:45

标签: c++ this

我有一个包含成员的堆栈类和一个名为push的函数。

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);通过MACRO替换

6 个答案:

答案 0 :(得分:5)

首先要做的事情!声明:

s1.push(3);

未翻译为:

 s1.push(this, 3);

但对于这样的事情:

STACK::push(&s1, 3); 

其中STACK::push可以在class / namespace STACK下被视为全局/名称空间或静态函数,其原型将是:

push(STACK const* pThis, int arg);

this指针始终是方法(函数)的第一个参数。如果method有零参数,它仍然有一个参数(类的this指针)。

答案 1 :(得分:3)

没有魔法

s1.push(3);

只是

的语法
STACK::push(&s1, 3);

答案 2 :(得分:0)

this = &s1

s1的地址是已知的,因此可以传递给STACK :: push。就这么简单:)

答案 3 :(得分:0)

C ++并不完全转换语句(因为C ++是一种语言规范,你可以通过多种方式实现该语言,甚至是 - 与一群奴隶在纸上工作;你不需要计算机,即使你想要一个,拥有C ++)。编译器(例如GCC)将语句转换为某些其他较低级别的表示。对于GCC,它是Gimple语句,并且可以检查Gimple表示,例如使用MELT's probe-fdump-tree-gimple以及其他选项(例如-fdump-tree-all-fdump-tree-ssa等...)

答案 4 :(得分:0)

不幸的是,您必须在C中显式或隐式指定指针。

对于C ++,编译器有责任将隐式this指针设置为类成员函数的参数。在您的代码中,成员函数在编译时自动编译为void STACK::push(STACK*, int),然后,当调用成员函数STACK::push时,编译器将设置对象地址(this)作为成员函数STACK::push的参数(通常是第一个)。

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

答案 5 :(得分:0)

编辑完成后,问题会出现另一个问题--C中的OOP。这很难且类型不安全,但可以实现。你可以看看GObject库,它提供了C语言中的对象系统。我猜它会大量使用宏。

相关问题