为什么C ++对象方法不像Python那样期望自变量?

时间:2018-11-26 02:41:58

标签: c++ python-3.x oop python-object

经过一些实验,我发现Python中有些古怪的东西(对于专家来说可能很明显,在这种情况下请原谅我)。 也就是说,与C ++相反,可以使用两种不同的语法来调用python类方法。我将通过一个简单的类给出两个最小的工作示例,该类仅包含一个integer属性,并可以向其添加另一个整数。首先是C ++。

#include <iostream>
using namespace std;
class MyClass
{
    int value;
    public:
    MyClass(int arg){value=arg;}
    int add(int arg){return arg+value;}
};

int main()
{
    MyClass anObject(4);
    cout<<"The addition gives "<<anObject.add(6)<<endl;//Outputs 10

    //cout<<"The alternative way to call the method gives "<<MyClass.add(anObject, 6)<<endl;  //Does not work

   //cout<<"Another alternative way to call the method gives "<<MyClass::add(anObject, 6)<<endl;  //Does not work either

   return EXIT_SUCCESS;
}

和python。

class MyClass(object):
    def __init__(self, arg=3):self.value=arg
    def add(self, arg):return arg+self.value
anObject=MyClass(4)
print(anObject.add(6)) #The C++ way, Outputs 10
print(MyClass.add(anObject, 6))  #Outputs 10

很显然,这不是我要解决的问题,但是这个问题的目的是要讨论为什么选项2成为python的功能,而在C ++中却不是选项2?它是否遵循某种语言的更深层次的设计哲学,还是与语言的编译与解释性质有关?相关,为什么self在python中显示为伪参数,但在C ++中却不显示?

1 个答案:

答案 0 :(得分:2)

Python类是运行时对象。每个对象都带有一个__class__指针。

执行obj.foo(x)时,它首先会在本地查找foo方法;如果找不到它,它将调用obj.__class__.foo(obj, x)

在C ++中,类不是运行时对象。具有虚拟方法或继承的对象具有一个vtable,但该vtable不是类,而是一种获取最小有效类型并为方法分配信息的方法。

现在您仍然可以像python一样调用C ++方法:

template<class T>
T& as_lvalue(T&&t){return t;}

std::ref( as_lvalue(&MyClass::add) )( anObject, 6 );

这使用了INVOKE概念(您可以在标准之后直接使用它)和成员函数指针。

这是一个图书馆解决方案。运行时可执行文件中没有MyClass对象。