-
C++で「using namespace std;」が悪習とされる理由とは?
C++の標準ライブラリとstd名前空間C++には、コンテナやアルゴリズムなど、アプリケーション開発で頻繁に使われる機能をまとめた標準ライブラリが用意されています。仮にこれらの名前がグローバル空間に直接定義されていたらどうなるでしょうか。例えばqueueクラスがグローバルに存在すると、ユーザーは同じ名前を衝突なく使うことができなくなってしまいます。そこでC++では、標準ライブラリの名前を格納するためにstdという名前空間が導入されました。using namespace文の役割using namespace文は、記述されたスコープ内で、std名前空間に属するすべての名前を、いちいちstd::という
-
C++で最小限の比較回数により3つの値の中央値を求める方法
この記事では、与えられた3つの値を比較することで、その中間(中央)の値を求める方法を解説します。例えば、3つの数値 (10, 30, 20) が与えられた場合、中央の値である 20 を返します。まずアルゴリズムの流れを確認し、その後、実際にC++コードとして実装していきましょう。アルゴリズム3つの値 a, b, c の中間値を求める手順は以下の通りです。ポイントは、比較を最小限の回数(最大でも3回)で済ませることにあります。 c, then return c else return b Endアルゴリズムの考え方まず a と b
-
C++の静的メンバー関数を使って生成されたオブジェクトの数をカウントする方法
この記事では、C++の静的メンバー関数(staticメンバー関数)を利用して、特定のクラスから生成されたオブジェクトの数をカウントする方法を解説します。静的メンバーの基本概念静的メンバーはクラスに属するプロパティであり、個々のオブジェクトに属するものではありません。つまり、1つのクラスに対して静的メンバーのインスタンスはたった1つしか存在せず、オブジェクトをいくつ生成しても、新たな静的メンバーが作成されることはありません。この特性を活かすことで、以下のような仕組みでオブジェクト数のカウントが実現できます。静的カウンター変数:これまでに生成されたオブジェクトの数を記録・保持します。静的メンバー関
-
C++のstatic_castとは?基本からエラー例まで解説
static_castとはstatic_castは、C++における通常の型変換(キャスト)を行うための演算子です。暗黙的な型変換を担う役割もあり、明示的に記述して呼び出すこともできます。例えば、floatからintへの変換、charからintへの変換などが代表的な使用例です。また、継承関係にあるクラス同士(基底クラスと派生クラス)のポインタ変換にも利用できます。C言語風のキャスト((int)x のような書き方)と比べると、static_castは意図が明確になり、コンパイラによる型チェックも働くため、より安全で可読性の高いコードになります。基本的な使用例以下は、float型の値をint型に変換
-
C++ Boostライブラリのany型で任意のデータ型を扱う方法
Boostライブラリには非常に幅広い機能が用意されていますが、その中の一つが「any型(boost::any)」です。any型を使うと、一つの変数に任意の型の値を格納することができます。JavaScriptやPythonなどの動的型付け言語では、このような柔軟なデータ型が標準で提供されていますが、C++で同様の機能を実現するには、Boostライブラリを利用するのが一般的です。 boost::anyの基本的な仕組み boost::anyは、int、char、std::string、doubleなど、あらゆる型の値を代入できる汎用的なコンテナです。格納した値を取り出す際にはboost::any_c
-
C++のfeclearexcept関数とは?浮動小数点例外をクリアする方法
C++のfeclearexcept()関数は、引数exceptsで指定された、サポートされている浮動小数点例外フラグをクリア(解除)するために使用される関数です。この関数は、指定されたすべての例外が正常にクリアされた場合、または引数の値が0だった場合に0を返します。一方、何らかの理由で例外をクリアできなかった場合には0以外の値を返します。なお、feclearexcept()を使用するには、事前にFENV_ACCESSを有効にしておく必要があります。これにより、プログラムから浮動小数点環境へアクセスできるようになり、発生した例外をテスト・操作することが可能になります。使用例以下のコードでは、すべ
-
【C++】overrideキーワードの使い方|関数オーバーライドのミスを防ぐ方法
関数オーバーライドは、C++における最も代表的な機能の一つです。基本的に関数オーバーライドとは、基底クラスで定義された関数を、派生クラスでもう一度定義し直すことを意味します。関数のシグネチャは同一ですが、動作(振る舞い)はそれぞれ異なります。しかし、オーバーライドの際にプログラマがミスをしてしまうケースがあります。例えば、シグネチャが一致していない場合、その関数はオーバーライドしたメソッドとしてではなく、まったく別の新しい関数として扱われてしまいます。こうしたミスを防ぐために活用できるのがoverrideキーワードです。このキーワードはC++11で導入されました。コンパイラはこのキーワードを検
-
Boost多倍長整数ライブラリで大きな数の階乗を計算する方法
大きな数の階乗を求めたい場合、C++の標準的な long long 型(64ビット)ではすぐに桁あふれが発生してしまいます。そこで役立つのが Boost ライブラリです。Boost の multiprecision(多倍長精度)ライブラリを利用すれば、64ビットを超える高精度な数値計算が可能になり、非常に大きな階乗の値も正確に求めることができます。 実装例 #include <bits/stdc++.h> #include <boost/multiprecision/cpp_int.hpp> using boost::multiprecision::cpp_int; u
-
【C++】set・multiset・unordered_set・unordered_multisetの違いを徹底解説
C++には、要素のコレクションを管理するための連想コンテナとして「set」「multiset」「unordered_set」「unordered_multiset」の4種類が用意されています。これらは一見似ていますが、「並び順」「重複の可否」「内部実装」の点で大きく異なります。この記事では、それぞれの特徴を実際のサンプルコードと出力結果をもとに詳しく解説し、最後に比較表で整理します。set の特徴set は最も基本的な集合コンテナで、以下のような性質を持ちます。データをソートされた順序(デフォルトは昇順)で格納する重複する値は格納できない(挿入時に自動的に除外される)要素の挿入・削除は可能だが
-
C++の組み込みデータ型が表現範囲を超えるとどうなる?オーバーフローによる無限ループの挙動を解説
C++では、組み込みデータ型が表現できる範囲を超えると、予期しない動作が発生することがあります。この記事では、具体的なコード例を通じて、char型・bool型・unsigned short型がそれぞれ範囲を超えたときにどのような挙動を示すのかを解説します。 char型の場合:無限ループに陥る まずはchar型の例です。以下のコードでは、0から300までの値を順に出力しようとしています。一見すると0から300まで出力して終了しそうですが、実際には無限ループが発生します。char型が保持できる値の範囲は-128から127までです。そのため、値が127を超えて増加すると、再び-128に戻ってしまい
-
C++の「3つのルール(Rule of Three)」とは?基本と考え方をわかりやすく解説
3つのルール(Rule of Three)とは「3つのルール(Rule of Three)」は、C++プログラミングにおける代表的な経験則(ベストプラクティス)のひとつです。このルールは次のような内容を指しています。クラスにおいて、以下のいずれかひとつでも明示的に定義する必要があるならば、残りの2つもおそらく必要になる——つまり3つすべてを定義すべきだというものです。コピーコンストラクタ代入演算子(operator=)デストラクタなぜ3つすべてが必要になるのかその理由はシンプルです。上記のいずれかが必要になるとき、そのクラスは動的に確保されたリソースを管理している可能性が高く、リソース管理を正
-
C++のコンストラクターはいつ呼び出される?オブジェクトの種類別に解説
C++では、コンストラクターが呼び出されるタイミングはオブジェクトの種類によって異なります。オブジェクトには「グローバル」「ローカル(非静的)」「静的ローカル」「動的」の4種類があり、それぞれ呼び出しのタイミングが異なるため、正しく理解しておくことが重要です。本記事では、各ケースについてサンプルコードと実行結果をもとに詳しく解説します。 1. グローバルオブジェクトの場合:main関数の実行前に呼び出される グローバルオブジェクトのコンストラクターは、main関数が実行される前に呼び出されます。プログラムの起動時にオブジェクトが初期化されるためです。 サンプルコード #include <
-
C++標準におけるint型・long型のサイズとは?アーキテクチャ別データモデルの違いを徹底解説
C++におけるint型やlong型のサイズは、実行環境のシステムアーキテクチャやOS(オペレーティングシステム)によって異なります。C++標準では各整数型の厳密なビット幅を固定していないため、環境ごとに定められた「データモデル」に従ってサイズが決まります。32ビットシステム:ILP32モデル32ビットシステムでは、ILP32と呼ばれるデータモデルが標準です。このモデルでは、int・long・ポインタ変数がすべて32ビットとして扱われます。64ビットシステム:LP64とLLP64の2種類64ビットシステムでは、OSに応じて次の2つのデータモデルが使われています。Linuxの場合:LP64モデルL
-
C++でPOSIXコマンドを実行して出力を取得する方法
C++のプログラム内からPOSIXコマンドを実行したい場面は少なくありません。実はその方法は非常にシンプルで、標準ライブラリが提供する system() 関数を使うだけで実現できます。この関数に文字列としてコマンドを渡すと、シェルを介してそのPOSIXコマンドが実行されます。system() 関数の基本構文system(command)引数には実行したいコマンドを表す文字列を渡します。戻り値として、コマンドの終了ステータスが返されます(正常終了時は一般的に 0 が返ります)。サンプルコード以下は、echo コマンドで文字列を出力し、bc コマンドで数式を計算する例です。#include <
-
gccでコンパイルしたC++プログラムがクラッシュした時、スタックトレースを自動的に出力する方法
概要Linux環境では、gccを使ってC/C++のコードをコンパイルするのが一般的です。gccはglibcライブラリを利用しており、execinfo.hヘッダーに用意されているbacktrace()関数を使うことで、エラー発生時点の呼び出しスタック(スタックトレース)を取得できます。この仕組みを応用すると、セグメンテーション違反(Segmentation Fault)などの致命的なエラーが発生した瞬間に、シグナルハンドラ経由で自動的にスタックトレースを出力させることが可能です。ここでは、その具体的な実装方法を紹介します。サンプルコード#include <iostream> #inc
-
C++でランダムなfloat値を生成する方法
C言語やC++では、標準の rand() 関数は整数(int)しか返さないため、ランダムな浮動小数点数(float)を直接生成することはできません。しかし、いくつかのテクニックを組み合わせれば、簡単にランダムなfloat値を作成できます。基本的な考え方:乱数をRAND_MAXで割るrand() は 0 から RAND_MAX までの整数を返します。この値を float 型にキャストしてから RAND_MAX で除算すると、必ず 0.0 ~ 1.0 の範囲の実数が得られます。さらに、任意の上限値までの乱数が必要な場合は、その値を掛けるだけで範囲をスケールできます。なお、整数同士のまま除算すると商
-
static_cast<>とCスタイルキャストの違いとは?C++の安全な型変換を解説
C++プログラミングにおける型変換(キャスト)には、大きく分けて「Cスタイルキャスト」と「static_cast<>」の2つの方法があります。本記事では、両者の違いと、なぜC++ではstatic_cast<>が推奨されるのかを詳しく解説します。 Cスタイルキャストとstatic_cast<>の基本 (int)x のような記述は、C言語から引き継がれた「Cスタイルキャスト」です。一方、C++では static_cast(x) という形式が使用されます。 両者の最大の違いは、static_cast<>にはコンパイル時の型チェック機能があるという点です。Cスタイルキャストにはこの機能がないため、誤
-
C++でプログラムを指定したミリ秒間スリープさせる方法
C++でプログラムをxミリ秒間スリープさせるには? この記事では、C++プログラムをユーザーが指定したxミリ秒間スリープ(待機)させる方法を解説します。 この処理を実現する方法はいくつかありますが、ここでは標準ライブラリのclock()関数を使用します。clock()関数は、プログラム実行開始時点からの現在のCPU時間を返します。まず、現在のクロック値と指定された待機時間xから終了時刻を計算し、その時刻に達するまで空のwhileループを実行して時間を待ちます。 ここで使用しているCLOCKS_PER_SECというマクロは、1秒あたりのクロックティック数を表すものです。このマクロを使うことで、ミ
-
C++でUnicode文字を出力する方法
C++でUnicode文字を出力するのは、通常の文字列出力とほとんど同じ手順で行えます。ポイントは、Unicodeのコードポイントの前に「\u」というプレフィックス(接頭辞)を付けることです。これにより、文字列リテラル内で直接Unicode文字を指定し、正しく表示することができます。注意:使用しているコンソールやターミナルがUnicodeに対応していない場合、期待どおりの結果を得ることはできません。本記事では、Unicodeを標準サポートしているLinux環境を使用して動作を確認しています。なお、この形式はC++11以降で導入された「ユニバーサル文字名(universal character
-
C++で実行時にメモリ使用量を取得する方法【Linux環境向け】
C++プログラムでは、仮想メモリ使用量や常駐セットサイズ(RSS:Resident Set Size)といったメモリ使用量の統計情報を、実行時に動的に取得できます。これらの情報を取得するには、OSが提供するシステムライブラリや特殊なファイルを利用します。ただし、取得方法はオペレーティングシステムによって異なるため、本記事ではLinux環境を例に解説します。 /proc/self/statからメモリ情報を読み取る仕組み Linuxでは、/proc/self/statファイルからカレントプロセス自身に関する詳細情報を取得できます。ここから以下の2つの指標を読み取り、メモリ使用状況を把握します。