カテゴリ: C++ 更新日: 2026/02/01

C++のconst参照とconstポインタの違いを完全ガイド!読み取り専用をマスター

const参照とconstポインタの違い
const参照とconstポインタの違い

先生と生徒の会話形式で理解しよう

生徒

「先生、参照やポインタに『const』が付くとどうなるんですか?違いが複雑で覚えられません……。」

先生

「『const』は、中身を書き換えられないようにする『読み取り専用』のプロテクトです。参照とポインタで、そのプロテクトのかかり方が少し違うんですよ。」

生徒

「読み取り専用……。どう使い分ければいいのか、詳しく教えてください!」

先生

「それでは、初心者の方でも絶対にわかるように、簡単な例えを使って整理していきましょう!」

1. constとは?データの「書き換え禁止」宣言

1. constとは?データの「書き換え禁止」宣言
1. constとは?データの「書き換え禁止」宣言

C++のプログラミングにおけるconst(コンスト)とは、変数の中身を後から変更できないようにするための命令です。プログラミング未経験の方には、「読み取り専用」の状態にすることだと考えていただくと分かりやすいでしょう。

パソコンを触ったことがない方でも、学校の「掲示板」をイメージしてみてください。掲示板に貼られたポスターは、誰でも読むことはできますが、勝手に内容を書き換えることはできませんよね。このように、データを安全に保護し、不用意な変更によるバグ(プログラムの間違い)を防ぐのが const の役割です。Google検索で「C++ const 意味」と調べる多くの人が、この「安全性の確保」という点に注目しています。

2. const参照とは?「読み取り専用のあだ名」

2. const参照とは?「読み取り専用のあだ名」
2. const参照とは?「読み取り専用のあだ名」

const参照(こんすとさんしょう)とは、ある変数に対して「内容は書き換えられないけれど、見ることはできる別名(あだ名)」を付ける仕組みです。以前の学習で学んだ「参照」に const を加えたものです。

例えば、あなたの通帳の残高を友達に見せるとします。友達に残高を「参照」させますが、勝手にお金を引き出されたら困りますよね。そこで「見るだけならいいよ(書き換えはダメ)」という条件で教えるのが、まさに const参照 です。文法的には const 型名& 名前 = 元の変数; と書きます。


#include <iostream>

int main() {
    int score = 100;
    const int& refScore = score; // scoreに対する読み取り専用の参照

    std::cout << "スコアを表示: " << refScore << std::endl;

    // refScore = 200; // ここでエラーになります(書き換え禁止!)
    
    return 0;
}

この refScore は、元の score という箱を指していますが、const が付いているため、この名前を使って中身を書き換えることは絶対にできません。これにより、非常に安全にデータを扱うことができます。

3. constポインタの基本:指し先を保護する

3. constポインタの基本:指し先を保護する
3. constポインタの基本:指し先を保護する

constポインタは、少しだけ複雑です。ポインタは「住所録」のようなものでした。const を使う位置によって、「住所に書いてある中身」を保護するのか、「住所録そのもの(指し先)」を保護するのかが変わります。

最もよく使われるのは、「指している中身を書き換えられないポインタ」です。これを const 型名* 名前; と書きます。住所録を使ってその家に行くことはできますが、家の家具を勝手に替えることはできない、という状態です。


#include <iostream>

int main() {
    int gold = 500;
    const int* pGold = &gold; // goldの場所を指すが、中身は書き換えられない

    std::cout << "所持金を確認: " << *pGold << std::endl;

    // *pGold = 1000; // エラー!住所の中身は変えられません
    
    int newGold = 2000;
    pGold = &newGold; // 住所録(ポインタ)を別の住所に書き換えるのはOK
    
    return 0;
}

上の例のように、指している中身は守られますが、ポインタが「別の場所を指すように書き換わること」は許されています。ここが参照との大きな違いです。

4. const参照とconstポインタの決定的な違い

4. const参照とconstポインタの決定的な違い
4. const参照とconstポインタの決定的な違い

初心者の方が最も迷うのが、「結局どちらを使えばいいの?」という点です。大きな違いは「指し先の変更ができるかどうか」「空の状態を許すか」です。図解をイメージして整理しましょう。

  • const参照: 一度決めた相手(変数)から、絶対に浮気しません。相手がいない「空(ヌル)」の状態も許されません。非常にシンプルで安全です。
  • constポインタ: 途中で別の住所を指し直すことができます。また、「今はどこも指していません(nullptr)」という状態も作れます。

C++のモダンな書き方では、「まずは const参照 を使い、どうしても途中で指し先を変えたい時や、空の状態が必要な時だけ constポインタ を使う」のが鉄則です。

5. 実践:関数での使い分け

5. 実践:関数での使い分け
5. 実践:関数での使い分け

これらの違いが最も活かされるのは、「関数」に大きなデータを渡す時です。文字列などの巨大なデータを関数に渡す際、コピーを作るとパソコンの動きが重くなります。そこで、読み取り専用の const を使って「場所」だけを教えるのです。


#include <iostream>
#include <string>

// const参照渡し:コピーせずに高速、かつ安全
void showHeroName(const std::string& name) {
    std::cout << "勇者の名前: " << name << std::endl;
    // name = "魔王"; // 読み取り専用なので書き換えエラー
}

int main() {
    std::string myHero = "アレックス";
    showHeroName(myHero);
    return 0;
}

このように const参照 を使うと、「データをコピーしないので速い」「書き換えないので安全」という二つのメリットを同時に得られます。これはC++プログラミングにおいて非常に重要なテクニックです。

6. もっと詳しく!ポインタ自身のconst(const pointer)

6. もっと詳しく!ポインタ自身のconst(const pointer)
6. もっと詳しく!ポインタ自身のconst(const pointer)

さらに詳しくなりたい方向けに、ポインタにはもう一種類の const があります。それは、「ポインタそのものが別の場所を指せないようにする」設定です。これを 型名* const 名前; と書きます。

住所録がページに固定されていて、別の住所を書き込めない状態です。もし const int* const ptr と書けば、「中身も変えられないし、指し先も変えられない」という最強のガード状態になります。初心者のうちは const int*(中身の保護)をメインで覚えれば十分ですが、この違いを理解していると「ポインタマスター」に一歩近づけます。

7. 安全なプログラムを作るための「守りの姿勢」

7. 安全なプログラムを作るための「守りの姿勢」
7. 安全なプログラムを作るための「守りの姿勢」

なぜこんなに面倒な const がたくさんあるのでしょうか?それは、プログラミングが「書く時間よりも、間違いを探す(デバッグ)時間の方が長い」からです。不用意に中身を変えられてしまうコードを放置すると、どこでデータがおかしくなったのか分からなくなります。

「変えないつもりのデータには、すべて const を付ける」。この守りの姿勢をconst正当性(const correctness)と呼びます。パソコン操作に慣れていない方でも、この「鍵をかける習慣」を身につけるだけで、あなたの書くプログラムの品質はプロレベルにまで引き上がります。Google検索エンジンの検索結果上位にある高品質なコードは、必ずこの const を適切に使っています。

8. まとめ表:const参照 vs constポインタ

8. まとめ表:const参照 vs constポインタ
8. まとめ表:const参照 vs constポインタ

最後に、学んだ内容を比較表で復習しましょう。これをブックマークしておけば、いつでも確認できます。

特徴 const参照 constポインタ
文法 const T& ref const T* ptr
指し先の変更 不可(固定) 可能(別の住所OK)
空(nullptr) 禁止(常に実体が必要) 許可(空でもOK)
使いやすさ 簡単・直感的 少し複雑

ポインタや参照は、C++の基礎でありながら奥が深い分野です。まずは const参照 を使って「読み取り専用のあだ名」を作るところから始めて、徐々にポインタの柔軟性に触れていきましょう。実際に手を動かしてエラーを体験するほど、あなたのスキルは確実に向上していきますよ!

カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.4
Java&Spring記事人気No4
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.5
Java&Spring記事人気No5
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.6
Java&Spring記事人気No6
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作