为什么c++中的成员函数在对象名后用点操作符访问?
Why are member functions in C++ accessed with dot operator after object name?
在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_; }
// ^^^^^
};
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 下标操作符重载以访问私有数组
- 通过自增操作符访问类成员
- 从结构体访问数据时,操作符重载到哪里去了?
- 从指针访问[]操作符
- 获取/释放通过[]操作符访问的原子变量的语义
- 如何创建一个std::map的常数值,它仍然可以被[]操作符访问
- c++为什么不使用星号操作符访问动态数组
- 在2D数组中通过重载数组下标操作符进行访问
- 通过结构和重载操作符包装CUDA共享内存定义和访问
- TBB concurrent_hash_map操作符[]或类似的访问
- 访问由std::shared_ptr封装的类的操作符重载
- 如何在重载操作符后访问标准的*此行为
- 通过std::unique_ptr使用std::map访问操作符[]的正确语法
- 从模板化的类赋值操作符访问私有成员变量
- 关于模板中随机访问迭代器的操作符+重载的问题
- 为什么c++中的成员函数在对象名后用点操作符访问?
- 在c++中从父命名空间访问隐藏操作符
- 如何在操作符[]上分离get和set访问