C++樹林– category –
-
【C++】データ型の種類を徹底解説(基本型からポインタ、構造体まで)
はじめに C++プログラミングの根幹をなすのが「型」の概念です。全ての変数やオブジェクトは、必ず何らかの型を持ち、その型によって、どのような値を保持できるか、どのような操作が可能かが決まります。 この記事では、C++の型システムを構成する主要な... -
【C++】constとvolatileの使い分け | cv修飾子を徹底解説
はじめに C++で変数を宣言する際、int x; のように型を指定するだけでなく、const や volatile といった修飾子を付け加えることができます。これらは、その変数がどのように扱われるべきかをコンパイラとプログラマに伝えるための重要なキーワードです。 c... -
【C++】型の別名を付けるtypedefとusingの違いと使い方
はじめに C++で、unsigned long long や関数ポインタ void (*)(int) のように、型名が長くて複雑になることがあります。このような型を何度も記述するのは、コードを読みにくくし、typoの原因にもなります。 この問題を解決するのが「型の別名宣言(タイプ... -
【C++】autoとdecltype | 型の自動推論と取得の方法を解説
はじめに C++で、std::vector<std::string>::iterator のように、非常に長くて複雑な型名を手で書くのは、面倒で、typoの原因にもなります。 C++11では、このような問題を解決し、コードをより簡潔で読みやすくするために、型の自動推論の仕組みが導... -
【C++17】構造化束縛の使い方 | pair, tuple, structを分解して受け取る方法
はじめに C++で、std::pairやstd::tupleを返す関数を扱う際、従来はその戻り値を一度変数に受け取り、.firstやget<0>を使って個々の要素にアクセスする必要があり、少し冗長でした。 C++17で導入された構造化束縛は、この問題をエレガントに解決しま... -
【C++】4種類のキャストを徹底解説 (static_cast, dynamic_cast 等)
はじめに C++には、intからdoubleへ、あるいは親クラスのポインタから子クラスのポインタへ、といった**明示的な型変換(キャスト)**を行うための、4つの異なるキャスト演算子が用意されています。これらは、古いC言語スタイルのキャスト (type)value よ... -
【C++】newとdeleteによる動的なメモリ確保・解放を徹底解説
はじめに C++では、通常の変数は宣言されたスコープを抜けると自動的に破棄されます。しかし、プログラムの実行時まで必要なサイズが分からない配列や、関数のスコープを超えて存在し続けるオブジェクトを扱いたい場合、ヒープと呼ばれる特別なメモリ領域... -
【C++】sizeof, alignof等 | 型のサイズとアライメントを扱う方法
はじめに C++でパフォーマンスを意識したプログラミングや、ハードウェアに近い低レベルなデータ操作を行う際、オブジェクトがメモリ上で「どれくらいの領域を占めるか(サイズ)」や、「どのようなアドレスに配置されるべきか(アライメント)」を正確に... -
【C++】右辺値参照とムーブセマンティクス入門 | 不要なコピーをなくし高速化
はじめに C++で、大量のデータを格納したvectorやstringを関数から返したり、別の変数に代入したりすると、内部のデータが全てコピーされ、大きなパフォーマンス上のオーバーヘッドが発生していました。 例えば、巨大なデータが入ったvectorを返す関数があ... -
【C++】リテラルとは?数値、文字、文字列などの定数の書き方を徹底解説
はじめに C++でプログラムを書く際、私たちは様々な「値」を直接コードに記述します。これらの、ソースコード上に直接表現される固定値のことをリテラルと呼びます。 C++には、扱うデータの種類に応じて、様々なリテラルの記述方法が用意されています。こ... -
【C++】文とは?if, for, whileなど主要な制御文をまとめて解説
はじめに C++のプログラムは、セミコロン(;)で終わる文(statement)を上から下へ順番に実行していくことで成り立っています。C++には、単純な計算を行う文から、条件によって処理の流れを変える(制御する)ための制御文まで、様々な種類の文があります... -
【C++】スコープとは?グローバル、名前空間、ローカルスコープの違いを解説
はじめに C++で変数を宣言する際、その「宣言された場所」によって、その変数がプログラムのどこから見えるかが決まります。この「名前が見える範囲」のことをスコープと呼びます。 スコープを正しく理解することは、意図しない変数の上書きを防ぎ、プログ... -
【C++】関数の基本 | 宣言・定義から戻り値の推論までを解説
はじめに C++プログラミングの中心となるのが「関数」です。関数は、関連する一連の処理を一つの単位としてまとめたものであり、プログラムを構造化し、コードの再利用性を高めるために不可欠です。 この記事では、C++の関数の基本を、以下のトピックに沿... -
【C++】クラス (class) とは?オブジェクト指向の重要概念を解説
はじめに C++におけるクラス (class) は、オブジェクト指向プログラミング(OOP)を実現するための中心的な機能です。クラスは、関連する**データ(状態)と操作(振る舞い)**を一つのまとまりとして定義した、オブジェクトの「設計図」として機能します... -
【C++】クラスメンバ徹底解説(変数・関数・型・アクセス制御)
はじめに C++のクラスは、オブジェクトの「設計図」です。この設計図は、メンバと呼ばれる様々な要素から構成されます。メンバを大きく分類すると、データを保持するための「メンバ変数」、操作を定義する「メンバ関数」、そしてクラス固有の型を定義する... -
【C++】クラスのメンバ変数 | データの種類とアクセス制御を徹底解説
はじめに C++のクラスは、オブジェクトの状態を表すデータを保持します。このクラス内で宣言された変数のことを「メンバ変数」または「データメンバ」と呼びます。メンバ変数には、オブジェクトごとに存在する通常の変数、クラス全体で共有される静的変数... -
【C++】継承のすべて | 仮想関数から抽象クラス、多重継承までを徹底解説
はじめに C++の**継承 (Inheritance)**は、オブジェクト指向の三本柱の一つであり、コードの再利用性を高め、拡張性の高い階層構造を構築するための強力な機能です。 この記事では、C++の継承にまつわる以下の主要な概念を、RPGのキャラクターを例に、網羅... -
【C++】関数オブジェクト(ファンクタ)とは?()演算子オーバーロードの使い方
はじめに C++のstd::sortのような標準アルゴリズムは、ソートの順序などをカスタマイズするために、比較ルールを引数として受け取ることができます。この「ルール」を渡す方法の一つが、**関数オブジェクト(ファンクタ)**です。 関数オブジェクトは、()... -
【C++】オーバーロード入門 | 関数と演算子を多重定義する方法
はじめに C++では、同じスコープ内に、同じ名前の関数や演算子を複数定義することができます。これを**オーバーロード(多重定義)**と呼びます。コンパイラは、渡された引数の型や個数(シグネチャ)を元に、どのバージョンを呼び出すべきかを自動的に判... -
【C++】テンプレート (template) 入門 | 汎用的な関数とクラスの作り方
はじめに C++のテンプレート (template) は、型をパラメータ化することで、汎用的なコードを書くための非常に強力な機能です。単に関数やクラスを汎用化するだけでなく、可変長の引数を扱ったり、特定の型に対して特別な処理を定義したりと、C++の表現力を... -
【C++】constexprとは?コンパイル時定数を使いこなす方法
はじめに C++で、配列のサイズやテンプレートの引数を指定する際、その値はコンパイル時に確定している必要があります。従来は、const修飾子を付けた定数などがこの役割を担っていましたが、より複雑な計算結果をコンパイル時定数として扱いたい、という要... -
【C++】ラムダ式の使い方を徹底解説(キャプチャ、ジェネリックラムダ)
はじめに C++でstd::sortやstd::find_ifのような標準アルゴリズムを使う際、条件を指定するためだけに関数を別途定義するのは面倒な場合があります。 C++11で導入されたラムダ式は、このような「その場で使い捨ての簡単な関数が欲しい」という要求に応える... -
【C++20】コルーチン入門 | 処理を中断・再開できる関数の作り方
はじめに C++の通常の関数は、一度呼び出されたら、returnするまで処理を中断できません。しかし、非同期処理や、データを少しずつ生成するジェネレータのような機能では、「処理の途中で一旦中断し、呼び出し元に制御を戻し、後でまた続きから再開する」... -
【C++】プリプロセッサ指令 (#include, #define, #if 等) の使い方を徹底解説
はじめに C++のソースコードが、コンパイラによって機械語に翻訳される前には、「プリプロセス(前処理)」というステップが存在します。プリプロセッサは、このステップで動作し、# で始まる特別な**ディレクティブ(指令)**に従って、ソースコードのテ... -
【C++】名前空間 (namespace) の使い方を徹底解説(スコープ、エイリアス、using)
はじめに C++で大規模なプログラムを開発したり、複数の外部ライブラリを組み合わせて使ったりすると、異なる場所で定義された関数や変数が、偶然同じ名前を持ってしまうことがあります。これを「名前の衝突(競合)」と呼び、コンパイルエラーや意図しな... -
【C++】属性 ([[noreturn]], [[deprecated]]など) の使い方を解説
はじめに C++11以降、属性 [[...]] という統一的な構文が導入されました。属性は、コードの様々な要素(関数、クラス、変数など)に付加情報を与え、コンパイラの最適化を助けたり、特定のコードの使われ方について警告を出させたりするためのものです。 ... -
【C++】エラーハンドリングの3つの主要な方法(戻り値・例外・グローバル変数)
はじめに C++で堅牢なプログラムを作成するには、エラーハンドリングが不可欠です。ファイルが見つからない、ネットワークに接続できない、不正な入力が行われた、といったエラーは日常的に発生します。これらのエラーを放置すると、プログラムはクラッシ... -
【C++】標準例外クラスの使い方 | out_of_range 等のエラーを使い分ける
はじめに C++でエラーが発生した際、単に throw "エラーメッセージ"; のように文字列を投げるのではなく、標準ライブラリ <stdexcept> などで定義されている標準例外クラスを使うのが良い習慣です。 これらのクラスは std::exception を基底クラスと... -
【C++】noexcept の使い方 | 例外を送出しないことを明示する
はじめに C++の関数は、潜在的に例外を投げる可能性があります。しかし、ゲッター関数やムーブコンストラクタのように、「この関数は絶対に例外を送出しない」と分かっているものも多くあります。 C++11で導入された**noexcept指定子は、関数宣言の後ろに... -
【C++】std::error_code と system_error | OSレベルのエラーを扱う方法
はじめに C++で、ファイルが存在しない、ネットワークがダウンしている、アクセス権がない、といったOSが原因のエラーを処理する場合、単なる int のエラーコードを返すだけでは、エラーの原因が何であるかが分かりにくくなります。 C++11では、このような...