topazの遊び場

いろいろやってみる

そろそろC++やるぞパート21 演算子 「::」「.」「->」「[ ]」

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

  • 今回は演算子::,.,->,[ ]を行っていきます。

    スコープ解決演算子::

スコープの識別や、曖昧さを解決するために使われます。
例えば namespace ごとに同名の変数が定義されていた時に、{namespace名}::{変数名}とすることでアクセス先を明示的に変えることができます。

namespace NamespaceA
{
    int x;
}

namespace NamespaceB
{
    int x;
}

int main()
{
    NamespaceA::x = 1;
    NamespaceB::x = 2;
    int x = 3;
    cout << NamespaceA::x << endl;
    cout << NamespaceB::x << endl;
    cout << x << endl;

    return 0;
}

Output

1
2
3

グローバルスペースは::xのようにアクセスすることができます。

int x;
int main(){
    int x = 1;
    ::x = 1;
}

namespaceはusingディレクティブによって、変数もアクセスできるようになります。

namespace NamespaceA
{
    int x;
}

namespace NamespaceB
{
    using namespace NamespaceA;
}

int main()
{
    NamespaceB::x = 4;
    // NamespaceBはNamespaceAのxを表しているので、4を出力する
    cout << NamespaceB::x << endl;
}

静的メンバの参照

::を用いて静的メンバ(staticメンバ)にアクセスすることができます。

class MyClass
{
public:
    static int X;
};

int main()
{
    MyClass::X = 34;
}

メンバアクセス修飾子., ->

これらは、structunionclassのメンバーを参照するために使用します。

  • ポインタではない場合は.
  • ポインタの場合は->

を使用します。

class MyClass
{
public:
    MyClass(int xVal)
    {
        x = xVal;
    };
    int x;
};

int main()
{
    MyClass mc = MyClass(32);
    cout << mc.x << endl;

    MyClass *mcPtr = new MyClass(42);
    cout << mcPtr->x << endl;
}

添字演算子 [ ]

添字演算子[ ]は、[配列](の要素指定とアクセスに用います。

int intAr[5] = {3, 4, 5, 6, 7};
cout << intAr[3] << endl;

これの応用で、演算子オーバーロードにも使いま

class MyIntArray
{
public:
    MyIntArray(int size)
    {
        intArray = new int[size];
        for (int i = 0; i < size; i++)
        {
            intArray[i] = 11 * i;
        }
    };

    inline int operator[](std::size_t index) const
    {
        cout << "aain" << endl;
        return intArray[index % size];
    }
    inline int &operator[](size_t index)
    {
        cout << "iiiiin" << endl;
        return intArray[index % size];
    }

private:
    int size;
    int *intArray;
};

参考リスト

感想

スコープ解決演算子::)だけ、初めての内容でしたが、他は復習みたいな形でした!前にやったことが出てくると楽しくなってきます。

次回も演算子の続きを行います。