Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向对象C编程——相当于';这';关键词?_C_Oop_Object_This - Fatal编程技术网

面向对象C编程——相当于';这';关键词?

面向对象C编程——相当于';这';关键词?,c,oop,object,this,C,Oop,Object,This,我正在用C语言进行面向对象的实验,基于答案。我遇到了一件我不能四处走动的事情。举个例子: struct foo { int val; int (*bar)(struct foo, int); } int foo_bar(struct foo mod, int val) { mod.val = val; } int main(void) { struct foo foo; foo.bar = foo_bar; foo.bar(foo, 8); }

我正在用C语言进行面向对象的实验,基于答案。我遇到了一件我不能四处走动的事情。举个例子:

struct foo {
    int val;
    int (*bar)(struct foo, int);
}

int foo_bar(struct foo mod, int val)
{
    mod.val = val;
}

int main(void)
{
    struct foo foo;
    foo.bar = foo_bar;
    foo.bar(foo, 8);
}
我认为如果有一种方法可以在C中使用
this
关键字,会更简单、更清晰:

struct foo {
    int val;
    int (*bar)(struct foo, int);
}

int foo_bar(int val)
{
    this.val = val;
}

int main(void)
{
    struct foo foo;
    foo.bar = foo_bar;
    foo.bar(8);
}

这听起来不可能,但可能有一些解决方法,有点像C中的OOP。在面向对象的C?

NO.CUD>中,有什么方法可以实现<代码> > <代码> >。C++中的这个< /代码>关键字是对当前对象的引用,并且实际上是明确地传递给ABI级别的成员函数。在函数中显式传递一个指向对象的指针(作为第一个参数)是C语言中最好的等价形式

struct foo {
    int   value;
    int (*func)(struct foo *, int);
};

void foo_bar(struct foo *f, int value)
{
    f->value = value;
}
i、 e.指向对象的指针作为第一个参数传递,而不是结构本身。这使得通过引用传递对象变得明确,并且使理解和维护此类代码变得更容易


期望在一种编程语言中看到的特性在另一种编程语言中是有效的是不明智的,即使这两种语言之间有某种关联

你看,每种编程语言都有自己的解决问题的方法,它们自己的。因为没有通用的最佳范例,所以最好使用具有最适用/有效/有用范例的编程语言来解决问题。例如,不编写C++程序来加速普通命令行任务;您可以使用shell脚本或其他简单脚本语言

作为一名程序员,能够从一种编程语言范式切换到另一种编程语言范式意味着您能够从不同的角度看待问题。看看当前的软件项目,最健壮、最重要、最高效的项目都是由具有这种能力的程序员编写的


这就是为什么我在上面指出,期望一种编程语言的特性或范例可以移植到其他语言是不明智的。你不应该这样做,因为这相当于拥有一个单一的工具,并且把所有的问题都看成你手头的工具是解决问题的唯一可能的工具。(如果你有一把锤子,所有问题都开始像钉子一样)学习,尤其是学习接受,不同的编程语言的不同范式,使一个更好的程序员,更好的问题解决者。< /P> < P>不。代码> C++中的这个< /Cord>关键字是对手头对象的引用,并且实际上在ABI级别显式地传递给成员函数。在函数中显式传递一个指向对象的指针(作为第一个参数)是C语言中最好的等价形式

struct foo {
    int   value;
    int (*func)(struct foo *, int);
};

void foo_bar(struct foo *f, int value)
{
    f->value = value;
}
i、 e.指向对象的指针作为第一个参数传递,而不是结构本身。这使得通过引用传递对象变得明确,并且使理解和维护此类代码变得更容易


期望在一种编程语言中看到的特性在另一种编程语言中是有效的是不明智的,即使这两种语言之间有某种关联

你看,每种编程语言都有自己的解决问题的方法,它们自己的。因为没有通用的最佳范例,所以最好使用具有最适用/有效/有用范例的编程语言来解决问题。例如,不编写C++程序来加速普通命令行任务;您可以使用shell脚本或其他简单脚本语言

作为一名程序员,能够从一种编程语言范式切换到另一种编程语言范式意味着您能够从不同的角度看待问题。看看当前的软件项目,最健壮、最重要、最高效的项目都是由具有这种能力的程序员编写的


这就是为什么我在上面指出,期望一种编程语言的特性或范例可以移植到其他语言是不明智的。你不应该这样做,因为这相当于拥有一个单一的工具,并且把所有的问题都看成你手头的工具是解决问题的唯一可能的工具。(如果你有一把锤子,所有问题都开始像钉子一样)学习,尤其是学习接受不同编程语言中的不同范式,这会成为更好的程序员,更好的问题解决者。

C++中的每个对象都可以通过一个称为“this”的重要指针访问自己的地址。“this”指针作为隐藏参数传递给所有非静态成员函数调用。我认为没有必要改变C的行为,因为C是C++的基础,如果你改变了C的行为,那么你怎么能在两种语言中都有所不同?如果你需要使用这个,为什么不只是使用C++?@SumitGemini说,你可以手动传递这个指针。C++中的每个对象都通过一个称为“this”的重要指针访问自己的地址。“this”指针作为隐藏参数传递给所有非静态成员函数调用。我认为没有必要改变C的行为,因为C是C++的基础,如果你改变了C的行为,那么你怎么能在两种语言中都有所不同?如果你需要使用这个,为什么不只是使用C++?@SumitGemini说,你可以手动传递一个指针。尽管令人失望。。。这似乎是正确的答案,如果C++确实通过<代码>这个<代码>到ABI。您可以自己验证这一点,只需将一个小类编译成汇编(
g++-S
),或编译成一个对象文件并将其反汇编(例如使用
objdump-d
)。(如果你想证明,就这么说吧,我将演示如何复制。)即使一种编程语言提供了奇妙的工具来实现某些东西,它背后也没有任何奇怪的东西;只是努力工作和良好的算法。我们都站在巨人的肩膀上,等等;甚至是编程语言。我不是