C++ の演算子

胡金庫 2023年10月12日
  1. C++ 言語で提供される一般的な演算子
  2. C++ でのオーバーロードされた操作
C++ の演算子

この記事では、C++ で演算子を使用する方法に関する複数の方法を示します。

C++ 言語で提供される一般的な演算子

演算子は、C++ プログラミングの式の重要な部分です。これらは、提供されたオペランドに対して実行されるさまざまな操作を提供し、評価された結果は通常、必要に応じてプログラマーによって利用されます。オペランドは、一般演算子と特殊演算子の 2つのタイプに大まかに分けることができます。一般的な演算子は、ほとんどのプログラミング言語でほぼ普遍的に実装されている操作であり、これらには、算術、論理、比較、代入、メンバーアクセス演算子、およびその他のいくつかが含まれます。

代数の規則と同様に、複数の演算子が式を形成する場合、優先順位と結合性の特性があります。この記事ではこれらのルールのいくつかを要約しますが、完全な説明は言語ドキュメンテーションと演算子優先順位表を参照する必要があります。基本的な算術演算の優先順位と結合性の規則は、一般的な数学の規則に似ていることに注意してください。したがって、次の例の式は、6030 の代わりに整数 2010 を出力します。

#include <iostream>

using std::cout;
using std::endl;

int main() {
  cout << 10 + 2 * 5 << endl;
  cout << 40 - 20 - 10 << endl;

  return EXIT_SUCCESS;
}

出力:

20
10

プログラマーは、代数で行われるのと同様に、括弧を使用して、優先順位と結合性の一般的な規則をオーバーライドできます。括弧で囲まれた各化合物式は、個別に評価される単位として扱われます。ポインタ演算を使用する際のよくある間違いの 1つは、括弧を見逃すことです。

ポインタ演算と逆参照演算を使用して配列内の要素にアクセスする場合は、算術演算を括弧で囲む必要があります。それ以外の場合、間接参照演算子は加算よりも優先順位が高いため、指定されたポインターが指す値は、ポインター自体ではなく、数値オペランドによってインクリメントされます。

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int vec[] = {10, 22, 63, 14};
  cout << *vec + 2 << endl;
  cout << *(vec + 2) << endl;

  return EXIT_SUCCESS;
}

出力:

12
63

C++ でのオーバーロードされた操作

C++ 言語で遭遇する可能性のある最も強力な機能の 1つは、クラスなどのユーザー定義オブジェクトで呼び出されたときにオペレーターがどのように動作するかをプログラマーが定義できることです。この機能は特定の演算子に代替操作を提供するため、オーバーロード演算子と呼ばれます。ただし、オーバーロードされた演算子を実装しても、オペランドの数と優先順位を変更できないことに注意してください。

次のコードスニペットは、2つの文字列データメンバーを含む Person クラスを宣言し、このタイプの+ 演算子をオーバーロードします。オーバーロードされた演算子は、operator キーワードで始まり、その後に演算子記号自体が続く、特別な名前を持つ他のクラス関数と同様に実装されます。これらの関数は、戻りタイプとパラメーターリストを持つことができます。演算子のオーバーロードの制限の 1つは、プログラマーが $>!!のような新しい演算子を作成できないことです。

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class Person {
 public:
  Person(string s1, string s2) : name(std::move(s1)), surname(std::move(s2)) {}

  Person operator+(const Person &p) {
    Person ret(name + p.name, surname + p.surname);
    return ret;
  }

  void printPerson() { cout << name << " " << surname << endl; }

 private:
  string name;
  string surname;
};

int main() {
  Person P1("Buddy", "Rich");
  Person P2("Lady", "Bee");
  P1 = P1 + P2;

  P1.printPerson();

  exit(EXIT_SUCCESS);
}

出力:

BuddyLady RichBee
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Operator