C++演算子を徹底解説!記号の使い方と独自の拡張方法を完全マスター
生徒
「C++に出てくる『+』や『-』、あと『<<』みたいな記号って、ただの計算用なんですか?」
先生
「これらは『演算子(えんざんし)』と呼びます。単なる計算だけでなく、データの比較や画面への出力など、いろいろな役割があるんですよ。」
生徒
「自分で作ったデータ型に合わせて、これらの記号のルールを新しく作れると聞いたのですが本当ですか?」
先生
「その通り!それを『演算子の拡張(オーバーロード)』と言います。初心者の方にも分かるように、基礎から応用まで一緒に見ていきましょう!」
1. 演算子(えんざんし)とは?プログラムの基本記号
C++の演算子とは、変数(データを入れる箱)に対して何らかの操作を行うための記号のことです。最もイメージしやすいのは算数で使う「足し算(+)」や「引き算(-)」ですが、プログラミングの世界にはもっとたくさんの種類があります。パソコンを全く触ったことがない方でも、電卓にある記号がプログラムの中でも同じような役割をしていると思えば、少し身近に感じられるはずです。
これらの記号を使いこなすことで、コンピューターに「この数字とこの数字を足して」「この結果を画面に表示して」といった指示を出すことができます。演算子はプログラムの「動詞」のような役割を担っており、これらを組み合わせることで複雑な自動処理が可能になります。
2. 算術演算子で計算の基本を学ぼう!
まずは、数値の計算に使う算術演算子です。これは日常生活で使う計算とほとんど同じですが、掛け算や割り算の記号がパソコン特有の形になっています。
+(加算):足し算-(減算):引き算*(乗算):掛け算(アスタリスクを使います)/(除算):割り算(スラッシュを使います)%(剰余):割り算の「余り」を計算
例えば、お菓子の合計金額を計算したり、余ったお釣りを計算したりするときに欠かせない演算子です。プログラミング未経験の方は、まずこの5つの記号を覚えるところからスタートしましょう。
int candy = 100;
int chocolate = 150;
int total = candy + chocolate; // 合計は250
int count = 10 / 3; // 答えは3(整数同士の割り算は切り捨てられます)
int remainder = 10 % 3; // 余りは1
3. 比較演算子で条件による判断を行う
次に、データ同士を比べる比較演算子です。これは「もし〜だったら」という条件分岐(if文など)とセットで使われます。比較した結果は「正しい(真:true)」か「正しくない(偽:false)」という答えで返ってきます。
==:右と左が等しいか(「=」が二つなので注意!)!=:等しくないか</>:より小さいか / より大きいか<=/>=:以下か / 以上か
身近な例で言うと、スマートフォンのパスコード入力で「入力した番号が正しい番号と一致するか(==)」といった判定に使われています。この比較演算子を理解すると、プログラムに「判断力」を持たせることができるようになります。
int score = 85;
if (score >= 80) {
// スコアが80以上なので、ここが実行されます
std::cout << "合格です!" << std::endl;
}
4. ストリーム演算子で画面やファイルとやり取りする
C++特有の記号に、ストリーム演算子があります。画面に文字を出すときに使う <<(挿入演算子)と、キーボードから入力を受け取るときに使う >>(抽出演算子)です。データの「流れる方向」を矢印のように表しているのが特徴です。
これを使うことで、プログラムが人間と対話できるようになります。パソコン初心者の方には、std::cout(シーアウト)が「画面という出口」、<< が「データを流し込む動作」とイメージすると分かりやすいでしょう。同様に std::cin(シーイン)は「入り口」からデータを持ってくる役割をします。
5. 演算子オーバーロードとは?記号の機能を拡張する
ここからがC++の面白いところです。演算子オーバーロード(拡張)を使うと、自分で作ったデータ形式に対して、既存の演算子(+や==など)に新しい意味を持たせることができます。通常、自作した「プレイヤー」や「座標」というデータ同士を足し算することはできませんが、この機能を使えばそれが可能になります。
例えば、x座標とy座標を持つ「位置」というデータがあったとき、わざわざ「xとxを足して、yとyを足して……」と細かく書かなくても、単に pos1 + pos2 と書くだけで合計が出るように設定できるのです。これを実現すると、コードが驚くほど短く、そして読みやすくなります。これは、複雑なシステムを効率よく作るための「職人の技」のようなものです。
6. 実例:自作クラスで演算子を使えるようにしてみよう
実際に、名前と所持金を持つ Wallet(財布)というクラスを作って、「+」で合算できるようにしてみましょう。演算子の拡張には operator というキーワードを使います。
#include <iostream>
#include <string>
class Wallet {
public:
int money;
Wallet(int m) : money(m) {}
// 「+」演算子を拡張して、財布同士を合算できるようにします
Wallet operator+(const Wallet& other) {
return Wallet(this->money + other.money);
}
};
int main() {
Wallet myWallet(1000);
Wallet gift(5000);
// まるで普通の数字のように財布同士を足せます!
Wallet total = myWallet + gift;
std::cout << "合計金額: " << total.money << "円" << std::endl;
return 0;
}
このように、プログラムの中で「何と何を計算させるか」というルールを自分で決められるのがC++の大きな魅力です。初心者の方は「記号の使い道は一つではない」ということを覚えておいてください。
合計金額: 6000円
7. モダンC++における「宇宙船演算子」の利便性
最近のC++(モダンC++)では、宇宙船演算子(<=>)という非常に便利な記号が登場しました。これ一つを定義するだけで、< や >、== などのすべての比較演算子をコンピューターが自動的に準備してくれます。
昔のプログラミングでは、すべての記号に対して一つずつルールを書かなければならず、とても大変でした。しかし、今のC++はとても賢くなっており、この新しい演算子のおかげで、より少ない手間で、よりミスの少ないプログラムが書けるようになっています。最新の技術を学ぶことは、作業を楽にすることにも繋がるのです。
8. 演算子を拡張する際の「やってはいけない」ルール
最後に、演算子の拡張を行う上での大切な注意点です。それは「本来のイメージを壊さない」ということです。例えば、「+」記号を拡張して「データを消去する」という動作をさせてはいけません。誰が見ても「+」は足し算、「==」は一致確認、という共通のイメージがあります。このルールを破ってしまうと、プログラムは一気に読みづらくなり、バグ(間違い)の原因になります。
また、C++ではすべての記号を書き換えられるわけではありません。例えば .(ドット)や sizeof など、役割が決まっていて変更できない記号もあります。自由度が高いC++だからこそ、決まったルールを守って「正しく、美しく」記号を使うことが求められます。これが、プログラミング初心者が「中級者」へと成長するための大事な考え方です。
9. 演算子を使いこなして一歩先のプログラミングへ
演算子の基礎から拡張までを見てきましたが、いかがでしたか?記号一つとっても、そこには深い意味と使い道があります。C++は一見難しそうに見えますが、こういった「演算子」のような身近な記号を一つずつマスターしていくことで、確実に力がついていきます。
まずは基本的な計算から始め、慣れてきたら自分だけのオリジナルの計算ルールを作ってみてください。自分の書いたコードが意図通りに動いたときの喜びは、プログラミングにおける最高の報酬です。この記事で紹介した演算子の使い方をヒントに、ぜひあなたの手で新しいプログラムを動かしてみてください!