は、メンバー目的球又は方法の任意の結合したコールが結合していないコール、すなわちに変換される:obj.method()
はmethod(obj)
と等価です。それで、すべてのメンバ関数の最初のパラメータはそれ自身です。オブジェクト名の後にC++のメンバー関数がドット演算子でアクセスするのはなぜですか? Pythonで
メンバー関数がドット演算子でアクセスされる理由を説明するC++にも同様の概念がありますか? C++、ドットで
は、メンバー目的球又は方法の任意の結合したコールが結合していないコール、すなわちに変換される:obj.method()
はmethod(obj)
と等価です。それで、すべてのメンバ関数の最初のパラメータはそれ自身です。オブジェクト名の後にC++のメンバー関数がドット演算子でアクセスするのはなぜですか? Pythonで
メンバー関数がドット演算子でアクセスされる理由を説明するC++にも同様の概念がありますか? C++、ドットで
は(「」)は、指定されたメンバオブジェクトにアクセスできるようにするオペレータです。別の演算子、矢印( ' - >')があります。この演算子を使用すると、そのオブジェクトへのポインタが与えられたオブジェクトのメンバにアクセスできます。これらはそれぞれ、メンバー変数とのメンバー関数の両方で機能します。各(非静的)メンバ関数の内部
、コードは、必要に応じて使用することができるオブジェクト(「本」)へのポインタへのアクセスを有します。そのオブジェクトのメンバーへのアクセスも利用できます。ドットが使用される理由に関しては
? Bjarne Stroustrup(PBUH)が数十年前に作ったデザインの選択肢です。構造体のメンバーへのCのアクセスを模倣します。
Stroustrupは '.'を発明しませんでした。それはC. –
から継承されました。私が言ったように、それは構造体メンバーのCのアクセスを模倣します。 –
のC++でobj.method()
とmethod(obj)
同等になり、そのような概念はありません。ユニコード関数呼び出し構文では、同じコードを呼び出すように提案されていますが、すぐにいつでも採用されるようには思われません。
初期のC++はC言語(それはもともと"C with Classes"と呼ばれた)のスーパーセットだったので、.
の使用は、「インスタンスのメンバー」を意味する、C言語へstruct
のKerniganとリッチーさん1973導入から来ています。
呼び出し元の関数をコンパイラが判断できるようにするには、どのオブジェクトを操作しているかを知る必要があります。そのため、既存のメンバーアクセス構文(object.member)オブジェクトアドレスを暗黙の引数として渡します。
なぜポインタですか? Cには参照がないためです。
アセンブリにコンパイルする前に、Cコードに、元のC++コンパイラ、CFront、翻訳された「クラスとC」と、後にC++。 Cとの後方互換性とバイナリ互換性は非常に重要であり、メンバー関数が呼び出されるオブジェクトを変更するためには、ポインタまたは参照によって渡す必要があります。ポインタはCとC++でサポートされていたので、ポインタを選択しました。したがって、this
はポインタであり、参照ではありません。 「this
パラメータを指定することがうんざりするほど冗長になり、C++が強く型付けされているので
# 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_; }
};
、そしてあなた:
ほぼ同じことは、Pythonで行われ、this
だけで、ユーザーが明示的である必要があります
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_; }
// ^^^^^
};
ありがとうございます。これは私が答えとして必要だったものです。私は正しく私の質問をフレーム化していないと思うので、人々はその点に答えなかったし、この質問をdownvoted理由です。悲しいことに、私は新しいユーザーでありたいと思っていますが、私はこの答えをあきらめることができませんでした。もう一度ありがとう – user6738446
PythonはC++ではありません。 –
おそらく構造体メンバがドット構文でアクセスされた言語のC起源。 –
これは、提案された統一呼び出し構文**がC++の一部ではないと投票されたためです(今のところ)。 –