91

というクラスを作りましたKwadrat。クラスには 3 つのintフィールドがあります。私の開発環境は、 &演算子Kwadratを介して作成されたオブジェクトからフィールドにアクセスすることを提案しています。両方のオペレーターを試してみたところ、オペレーターはオブジェクト フィールドのデータに正常にアクセスできることがわかりましたが、オペレーターについては同じことが言えませんでした。また、オペレーターがクラスメンバーにもアクセスすることがわかりました。私は混乱しており、オブジェクト メンバーやメソッドにアクセスするためのメンバーが 3 つある理由がわかりません。3 つの演算子の違いを教えてください。::->->->.


          1.->

          2.::

          3..




    #include <iostream>

    using namespace std;

    class Kwadrat{

    public: 
        int val1,
            val2,
            val3;

        Kwadrat(int val1, int val2, int val3)
        {
            this->val1 = val1; // Working
            this.val2 = val2;  // Doesn't Work!
            this::val3 = val3; // Doesn't Work!
        }
    };


    int main()
    {
        Kwadrat* kwadrat = new Kwadrat(1,2,3);

        cout<<kwadrat->val1<<endl;
        cout<<kwadrat->val2<<endl;
        cout<<kwadrat->val3<<endl;

        return 0;
    }


4

8 に答える 8

170

1. to object->経由でオブジェクトのメンバー変数とメソッドにアクセスするためpointer

Foo *foo = new Foo();
foo->member_var = 10;
foo->member_func();

2.. オブジェクトを介してオブジェクトのメンバー変数とメソッドにアクセスするためinstance

Foo foo;
foo.member_var = 10;
foo.member_func();

3.または::の静的変数およびメソッドにアクセスするため。また、別のスコープから変数や関数にアクセスするために使用することもできます (実際には、クラス、構造体、名前空間がその場合のスコープです)。class/structnamespace

int some_val = Foo::static_var;
Foo::static_method();
int max_int = std::numeric_limits<int>::max();
于 2012-08-10T13:35:59.737 に答える
29

C++ では、型に応じて異なる演算子を使用して、フィールドまたはメソッドにアクセスできます。

  • ClassName::FieldName : class public static フィールドとメソッド
  • ClassInstance.FieldName : クラス参照を介して public フィールド (またはメソッド) にアクセスする
  • ClassPointer->FieldName : クラス ポインタを逆参照するパブリック フィールド (またはメソッド) にアクセスする

静的フィールドまたはメソッドはクラスのすべてのインスタンスに共通であるため、 :: はクラス インスタンスではなくクラス名と共に使用する必要があることに注意してください。

class AClass{
public:
static int static_field;
int instance_field;

static void static_method();
void method();
};

次に、次の方法でアクセスします。

AClass instance;
AClass *pointer = new AClass();

instance.instance_field; //access instance_field through a reference to AClass
instance.method();

pointer->instance_field; //access instance_field through a pointer to AClass
pointer->method();

AClass::static_field;  
AClass::static_method();
于 2012-08-10T13:36:44.150 に答える
18

非常に簡単に言え::ば、スコープ演算子、.アクセス演算子(実際の名前を忘れていますか?)、および->間接参照矢印です。

::-関数のスコープ。つまり、関数がどのクラスに存在するか、つまり関数の呼び出し方法をコンパイラーに知らせます。この演算子を使用して関数を呼び出す場合、その関数はstatic関数です。

.-これにより、作成済みのオブジェクトのメンバー関数にアクセスできます。たとえば、タイプが。のインスタンス化されたオブジェクトFoo x; x.bar()のメソッドを呼び出します。これを使用して、パブリッククラス変数にアクセスすることもできます。bar()xFoo

->.-これがポインタ型で機能することを除いて、基本的に同じことです。本質的には、を呼び出すよりも、ポインタを逆参照します.。これを使用することはと同等です(*ptr).method()

于 2012-08-10T13:37:44.307 に答える
8

オブジェクトへのポインターがあります。したがって、ポインターが指すオブジェクトのフィールドにアクセスする必要があります。を使用するポインターを逆参照し*、フィールドにアクセスするには、 を使用する.ため、次を使用できます。

cout << (*kwadrat).val1;

括弧が必要であることに注意してください。この操作は、かなり前 (C が若い頃) に、「簡略化された」方法を作成することを決定したほど一般的です。

cout << kwadrat->val1;

これらは同一であると定義されています。ご覧のとおり、 は->基本的に a*と a.を 1 つの操作に結合するだけです。オブジェクトまたはオブジェクトへの参照を直接扱っている場合は、.最初にポインターを逆参照せずに を使用できます。

Kwadrat kwadrat2(2,3,4);

cout << kwadrat2.val1;

::スコープ解決演算子です。nameを修飾する必要があるだけで、個々のオブジェクトをまったく扱っていない場合に使用されます。これは、主に静的データ メンバーにアクセスするためのものです。

struct something { 
    static int x; // this only declares `something::x`. Often found in a header
};

int something::x;  // this defines `something::x`. Usually in .cpp/.cc/.C file.

この場合、 でxあるためstatic、 の特定のインスタンスには関連付けられていませんsomething。実際、そのタイプのオブジェクトのインスタンスが作成されていなくても存在します。この場合、スコープ解決演算子でアクセスできます。

something::x = 10;

std::cout << something::x;

ただし、特定のオブジェクトのメンバーであるかのように、静的メンバーにアクセスすることも許可されていることに注意してください。

something s;

s.x = 1;

少なくともメモリが機能する場合、C++ の歴史の初期にはこれは許可されませんでしたが、意味は明確であるため、許可することにしました。

于 2012-08-10T13:43:12.150 に答える
7

IDE からの誤解を招く注記にもかかわらず、3 つの演算子は関連していますが、異なる意味を持っています。

::演算子はスコープ解決演算子と呼ばれ、名前空間またはクラスからそのメンバーの 1 つに取得するために使用されます。

.and演算子は、オブジェクト インスタンスのメンバーにアクセスするための->ものであり、オブジェクト インスタンスの作成後にのみ機能します。.実際のオブジェクト (または宣言さ&れた型で with で宣言されたオブジェクトへの参照) がある場合に使用し->、オブジェクトへのポインター (宣言さ*れた型で with で宣言された) がある場合に使用します。

オブジェクトは常に現在のインスタンスへのthisポインターであるため、機能するのは->演算子だけです。

例:

// In a header file
namespace Namespace {
    class Class {
        private:
            int x;
        public:
            Class() : x(4) {}
            void incrementX();
    };
}

// In an implementation file
namespace Namespace {
    void Class::incrementX() {    // Using scope resolution to get to the class member when we aren't using an instance
        ++(this->x);              // this is a pointer, so using ->. Equivalent to ++((*this).x)
    }
}

// In a separate file lies your main method
int main() {
    Namespace::Class myInstance;   // instantiates an instance. Note the scope resolution
    Namespace::Class *myPointer = new Namespace::Class;
    myInstance.incrementX();       // Calling a function on an object instance.
    myPointer->incrementX();       // Calling a function on an object pointer.
    (*myPointer).incrementX();     // Calling a function on an object pointer by dereferencing first

    return 0;
}
于 2012-08-10T13:41:57.160 に答える
3

-> クラスインスタンスへのポインタ用です

. クラスインスタンス用です

:: はクラス名用です - たとえば、静的メンバーを使用する場合

于 2012-08-10T13:36:37.577 に答える
3

「::」は静的メンバー用です。

于 2012-08-10T13:36:29.720 に答える
1

couts他の人は異なる構文に答えました、しかしあなたがあなたをしているとき、あなたはあなただけを使っていることに注意してください->

int main()
{
    Kwadrat* kwadrat = new Kwadrat(1,2,3);
    cout<<kwadrat->val1<<endl;
    cout<<kwadrat->val2<<endl;
    cout<<kwadrat->val3<<endl;
    return 0;
}
于 2012-08-10T13:37:35.213 に答える