2016-08-20 4 views
-5

は、メンバー目的球又は方法の任意の結合したコールが結合していないコール、すなわちに変換される:obj.method()method(obj)と等価です。それで、すべてのメンバ関数の最初のパラメータはそれ自身です。オブジェクト名の後にC++のメンバー関数がドット演算子でアクセスするのはなぜですか? Pythonで

メンバー関数がドット演算子でアクセスされる理由を説明するC++にも同様の概念がありますか? C++、ドットで

+5

PythonはC++ではありません。 –

+1

おそらく構造体メンバがドット構文でアクセスされた言語のC起源。 –

+2

これは、提案された統一呼び出し構文**がC++の一部ではないと投票されたためです(今のところ)。 –

答えて

3

は(「」)は、指定されたメンバオブジェクトにアクセスできるようにするオペレータです。別の演算子、矢印( ' - >')があります。この演算子を使用すると、そのオブジェクトへのポインタが与えられたオブジェクトのメンバにアクセスできます。これらはそれぞれ、メンバー変数のメンバー関数の両方で機能します。各(非静的)メンバ関数の内部

、コードは、必要に応じて使用することができるオブジェクト(「本」)へのポインタへのアクセスを有します。そのオブジェクトのメンバーへのアクセスも利用できます。ドットが使用される理由に関しては

? Bjarne Stroustrup(PBUH)が数十年前に作ったデザインの選択肢です。構造体のメンバーへのCのアクセスを模倣します。

+0

Stroustrupは '.'を発明しませんでした。それはC. –

+0

から継承されました。私が言ったように、それは構造体メンバーのCのアクセスを模倣します。 –

3

のC++でobj.method()method(obj)同等になり、そのような概念はありません。ユニコード関数呼び出し構文では、同じコードを呼び出すように提案されていますが、すぐにいつでも採用されるようには思われません。

1

初期の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_; } 
    //  ^^^^^ 
}; 
+0

ありがとうございます。これは私が答えとして必要だったものです。私は正しく私の質問をフレーム化していないと思うので、人々はその点に答えなかったし、この質問をd​​ownvoted理由です。悲しいことに、私は新しいユーザーでありたいと思っていますが、私はこの答えをあきらめることができませんでした。もう一度ありがとう – user6738446

関連する問題