为什么c++中的成员函数在对象名后用点操作符访问?

Why are member functions in C++ accessed with dot operator after object name?

本文关键字:操作符 访问 对象 c++ 成员 函数 为什么      更新时间:2023-10-16

在Python中,任何对成员函数或方法的绑定调用都会被转换为未绑定调用,即:obj.method()等效于method(obj)。这就是为什么每个成员函数的第一个参数是它自己。

在c++中是否有类似的概念来解释为什么使用点操作符访问成员函数?

在c++中,点('.')是一个操作符,它允许您访问给定的成员和对象。还有另一个操作符arrow('->'),它允许您在给定指向对象的指针的情况下访问该对象的成员。这些方法都适用于成员变量成员函数。

在每个(非静态)成员函数内部,代码可以访问一个指向对象('this')的指针,可以根据需要使用该指针。在这里也可以访问该对象的成员。

关于为什么要用点呢?这只是Bjarne Stroustrup (PBUH)在几十年前做出的设计选择。它模仿C语言对结构体成员的访问。

没有这样的概念使得obj.method()method(obj)在c++中是等价的。有一个统一函数调用语法的建议,可以使它们调用相同的代码,但据我所知,它似乎不会很快被采用。

早期的c++是C语言的超集(它最初被称为"带类的C "),所以.的使用来自Kernigan和Ritchie在1973年将struct引入C语言,意思是"实例的成员"。

为了让编译器确定你正在调用哪个函数,它需要知道你正在作用于哪个对象,因此简单的决定是重用现有的成员访问语法(object.member)并将对象地址作为隐式参数传递。

为什么是指针?因为C语言没有引用

最初的c++编译器CFront在编译成汇编之前,先将"C with classes"和后来的c++翻译成C代码。与C语言的向后和二进制兼容性是至关重要的,为了使成员函数修改被调用的对象,它需要通过指针或引用传递。因为C和c++都支持指针,所以他们选择了指针。因此,this是指针,而不是引用。

大致相同的事情发生在Python中,this只是必须由用户显式:

# Python
class MyClassNameHere(object):
    _a = -1
    def __init__(self):
        self._a = 0
    def setA(self, a):
        self._a = a
    def getA(self):
        return self._a
// C++
struct MyClassNameHere {
    int a_;
    MyClassNameHere() : a_(0) {}
    void setA(int a) { a_ = a; }
    int getA() const { return a_; }
};

由于c++是强类型的,必须指定this形参将是冗长乏味的,并且您必须注意const的:

struct MyClassNameHere {
    int a_ = -1;
    MyClassNameHere(MyClassNameHere* this) : a_(0) {}
    void setA(MyClassNameHere* this, int a) { a_ = a; }
    int setA(const MyClassNameHere* this) const { return a_; }
    //       ^^^^^
};