-
C++で先頭に付く二重コロン「::」の意味とは?スコープ解決演算子の使い方を解説
C++において、先頭に付けられた二重コロン「::」はスコープ解決演算子(scope resolution operator)と呼ばれます。この演算子は、名前がどのスコープに属するかを明示的に指定するために使用され、主に以下のような用途があります。クラスの外部でメンバ関数を定義するスコープ解決演算子を使うと、クラス宣言の外側でメンバ関数を定義できます。クラス内では関数のプロトタイプ(宣言)のみを行い、実装を「クラス名::関数名」の形式で記述します。これにより、クラスのインターフェースと実装を分離でき、コードの可読性が向上します。サンプルコード#include<iostream> us
-
C++でmain関数は自分自身を呼び出せる?再帰呼び出しの仕組みを解説
C++では、main()関数は自分自身を呼び出すことができます。これは「再帰呼び出し(recursion)」の一例であり、再帰とは関数が自分自身を呼び出すことを指します。以下のプログラムでその動作を確認してみましょう。 サンプルプログラム #include<iostream> using namespace std; int main() { static int x = 1; cout << x << ; x++; if(x == 11) { return 0; } main(); } 実行
-
C++でNULLクラスポインタ経由でクラスメソッドを呼び出す方法
はじめにC++では、NULLクラスポインタを介してクラスのメンバ関数(メソッド)を呼び出すことができます。一見奇妙な動作に思えますが、特定の条件下ではコンパイル・実行ともに可能です。注意: これは未定義動作(undefined behavior)であり、プログラムの正常な実行は一切保証されません。実際の結果は、使用するコンパイラや環境によって異なります。実務のコードでは絶対に避けるべき書き方ですので、ここではC++の内部的な仕組みを理解するための参考として読んでください。サンプルプログラムNULLポインタ経由でメンバ関数を呼び出すプログラムの例を以下に示します。#include <ios
-
C++で素数を見つける最速のアルゴリズムとは?エラトステネスの篩を徹底解説
nがおよそ1000万以下の規模である場合、n未満の素数を高速に求める方法として、最も効率的なアルゴリズムのひとつが「エラトステネスの篩(ふるい)」です。この手法は計算量がO(n log log n)と非常に効率的で、競技プログラミングから実務まで幅広く活用されています。エラトステネスの篩とはエラトステネスの篩は、古代ギリシャの数学者エラトステネスによって考案された古典的な素数列挙アルゴリズムです。2からnまでの整数を順に走査し、それぞれの素数の倍数を順次「ふるい落とす」ことで、最終的に残った数だけを素数として抽出します。サンプルプログラム以下は、エラトステネスの篩をC++で実装したプログラムの
-
【C++入門】通常の配列を任意のデフォルト値で初期化する方法
配列全体を0で初期化する最も簡単な方法C++では、配列全体を0で初期化するのは非常に簡単です。宣言時に以下のように {0} を指定するだけで、すべての要素が0になります。int arr[10] = {0};0以外の値ではうまくいかない理由しかし、同じ方法で配列全体を0以外の値で初期化することはできません。次のようなコードを書いても、意図した結果にはなりません。int arr[10] = {5};この場合、最初の要素だけが5で初期化され、残りの9個の要素はすべて0で初期化されます。これは、初期化リストで明示的に値を指定しなかった要素には自動的に0が代入されるというC++の仕様によるものです。fo
-
C++でNULLオブジェクトポインタからメンバー関数を呼び出す方法
C++では、NULLオブジェクトポインタを使ってクラスのメンバー関数を呼び出すことができます。 注意:これは未定義動作(undefined behavior)であり、プログラムが正しく実行される保証は一切ありません。実際の結果は、使用するコンパイラによって異なります。あくまで言語仕様の理解を深めるための例としてご覧ください。 以下に、この挙動を示すサンプルプログラムを紹介します。 サンプルコード #include <iostream> using namespace std; class Demo { public : void fun() { c
-
【C++入門】静的クラスメンバーはいつ初期化される?仕組みとサンプルコードを解説
静的クラスメンバーとは C++では、staticキーワードを使ってクラスに静的メンバー(スタティックメンバー)を定義できます。静的メンバーは特定のオブジェクトに属するのではなく、クラスそのものに紐づくメンバーです。 メモリ上には静的メンバーのコピーが1つだけ存在するため、オブジェクトをいくつ生成しても、すべてのオブジェクトが同じ値を共有します。オブジェクト間で共通のカウンタや設定値を管理したい場合などに非常に便利な仕組みです。 静的メンバーが初期化されるタイミング 静的クラスメンバーは、他の方法で明示的に初期化しない場合でも、自動的にゼロで初期化されます。静的記憶域期間を持つ変数は、プログラ
-
C++のnew演算子はいつ使う?使うべきケースと使い分けのポイント
C++におけるnew演算子は、ヒープ領域への動的なメモリ割り当てを要求するために使用します。十分な空きメモリがあれば、指定された型のメモリを確保・初期化し、その先頭アドレスをポインタ変数へ返します。 new演算子を使うべきケースとは? new演算子を使うかどうかの判断基準はシンプルです。「deleteが呼び出されるまでオブジェクトをメモリ上に保持しておきたい場合」にのみnewを使用します。 逆にnewを使わずに通常の方法でオブジェクトを宣言した場合、そのオブジェクトはスコープ(有効範囲)を抜けた時点で自動的に破棄されます。つまり、以下のような違いがあります。 newで生成したオブジェクト:
-
C++関数からローカル配列を返す方法とは?静的配列を使った実装例を解説
C++では、ローカル配列をそのまま関数から返すことはできません。これは、関数の呼び出しが終わるとローカル配列がメモリ上から消えてしまうためです。この問題を解決する方法の一つが、関数内で静的配列(static配列)を使用することです。静的配列の寿命はプログラム全体に及ぶため、関数から返しても上記のような問題が発生しません。以下に、実際に動作するサンプルプログラムを示します。サンプルコード#include <iostream> using namespace std; int *retArray() { static int arr[10]; for(int i = 0
-
【C++入門】変数と実数を使って配列を初期化する方法を徹底解説
配列とは配列とは、連続したメモリ領域上に同じ型の要素をまとめて格納したデータ構造です。配列内で最も小さいアドレスは先頭の要素に対応し、最も大きいアドレスは末尾の要素に対応します。また、配列のインデックス(添字)は 0 から始まり、最大で「配列サイズ - 1」までとなります。C++では、配列を初期化する際に変数だけでなく、実数(数値リテラル)を直接指定することもできます。以下のサンプルプログラムで、その具体的な方法を見ていきましょう。サンプルコード#include <iostream>using namespace std;int main() {
-
C++の静的メンバー変数とは?初期化方法をサンプルコード付きで解説
C++の静的メンバー変数(staticメンバー変数)は、staticキーワードを使って定義される特殊なクラスメンバーです。最大の特徴は、メモリ上にただ1つのコピーしか存在しないという点にあります。そのため、クラスからいくつオブジェクトを生成しても、静的メンバー変数はすべてのオブジェクト間で共有されます。また、静的メンバー変数が何らかの方法で明示的に初期化されていない場合、クラスの最初のオブジェクトが生成された時点で自動的に0に初期化されるというルールもあります。静的メンバー変数の主な特徴クラス全体で共有される単一のコピーを持つオブジェクトごとではなく、クラスに属する変数として扱われるクラス内で
-
C++でdouble型を文字列に変換する方法【std::to_stringの使い方】
C++では、std::to_string関数を使うことで、double型の値を簡単に文字列(string)へ変換できます。この関数は引数としてdouble型の値を受け取り、その値を文字の並びとして格納したstringオブジェクトを返します。以下に、実際の使用例を示すサンプルプログラムを紹介します。サンプルコード#include <iostream> #include <string.h> using namespace std; int main() { double d = 238649.21316934;
-
C++で組み合わせと順列を計算する方法をわかりやすく解説
組み合わせと順列とは組み合わせ(Combination)と順列(Permutation)は、数学の一分野である組合せ論(Combinatorics)に属する概念です。順列とは、n個の要素の中から、1つずつ・いくつかずつ・あるいはすべてを一度に取り出して並べるときの、異なる並び方の総数のことです。並べる順序が結果に影響する点が特徴です。一方、組み合わせとは、同じくn個の要素から1つずつ・いくつかずつ・すべてを取り出して選ぶときの、異なる選び方の総数です。順序は考慮されないため、順列よりも数が少なくなります。計算式順列の数n個の要素全体からr個の要素を並べるときの順列の数は、次の公式で求められます
-
C++のメンバー関数における静的変数の仕組みと使い方を実例で解説
C++では、メンバー関数の中でもstaticキーワードを使って静的変数(static変数)を宣言できます。静的変数にはいくつか重要な特徴があります。メンバー関数内の静的変数の特徴メモリ上の領域が割り当てられるのはプログラム実行中に1回だけであり、その領域はプログラム全体の終了まで保持されます。プログラム全体を見ても、その変数の実体(コピー)はただ1つしか存在しません。明示的に初期化しない場合、整数型などの静的変数は自動的に0で初期化されます。オブジェクトごとに値が作られるのではなく、すべてのオブジェクト間で同じ変数が共有されます。以下は、C++のメンバー関数内で静的変数を使う例を示すサンプルプ
-
C++の静的(static)オブジェクトはいつ破棄されるのか?仕組みをサンプルコード付きで解説
C++において、静的(static)オブジェクトとは、キーワードstaticを付けて宣言されたオブジェクトのことです。静的オブジェクトはプログラムの実行中に一度だけ初期化され、静的記憶域(static storage area)と呼ばれる特別なメモリ領域に格納されます。そして重要なポイントとして、静的オブジェクトが破棄されるのはプログラムが終了するときだけです。つまり、静的オブジェクトはプログラムが終了するまで存続し続けます。通常のローカル変数やオブジェクトは、スコープを抜けると自動的に破棄されますが、静的オブジェクトにはそのようなことは起こりません。静的オブジェクトのサンプルコード以下は、C
-
C++の関数で配列引数のサイズを出力する方法
C++では、データ型のサイズを sizeof() 演算子を使って取得できます。しかし、配列を関数に渡した場合と、定義元のスコープ内で直接サイズを取得した場合では、結果が異なることに注意が必要です。この記事では、関数に渡された配列パラメータのサイズを出力するサンプルプログラムを通じて、その挙動の違いを詳しく解説します。 サンプルコード #include <iostream> using namespace std; int func(int a[]) { cout << Size: << sizeof(a); return 0; } int
-
C++で静的クラスを作成する方法|静的メンバーと静的関数の実装例を解説
C++に「静的クラス」は存在しないC++には、C#のような「静的クラス(static class)」という概念は存在しません。最も近い実現方法は、静的データメンバーと静的メンバー関数のみで構成されるクラスを定義することです。クラス内の静的データメンバーは、メモリ上にコピーが1つしか存在しないため、そのクラスのオブジェクトがいくつ生成されても、すべてのオブジェクト間で共有されます。一方、静的メンバー関数からアクセスできるのは、静的データメンバー、他の静的メンバー関数、またはクラス外部の関数などに限られます。以下のプログラムは、C++における静的データメンバーと静的メンバー関数の動作を示したもので
-
C++で動的計画法により0-1ナップサック問題を解く方法:アルゴリズムと実装例
本記事では、動的計画法(Dynamic Programming)を用いて0-1ナップサック問題を解くC++プログラムを紹介します。0-1ナップサック問題とは、それぞれ重さと価値が異なる複数の品物が与えられたとき、ナップサックの容量(許容重量)を超えない範囲で、合計価値が最大になるように品物を選ぶ組合せ最適化問題です。「0-1」という名称は、各品物について「選ぶ(1)」か「選ばない(0)」の二択しかないことに由来しています。 動的計画法によるアプローチ すべての品物の組み合わせを総当たりで調べる全探索では、品物の数に対して計算量が指数関数的に増大してしまいます。そこで有効なのが動的計画法です
-
C++でシェーカーソートを実装する方法|アルゴリズムとサンプルコード解説
シェーカーソートとは シェーカーソート(Shaker Sort)は、与えられたデータを昇順に並べ替えるためのソートアルゴリズムの一つです。バブルソートとよく似ていますが、決定的に異なるのは配列を双方向(往復)に走査して整列を進める点です。「カクテルソート」「双方向バブルソート」と呼ばれることもあります。このアルゴリズムの最悪計算量は O(n²) です。 アルゴリズムの手順 開始 ShakerSort() 関数は、引数としてデータ配列 arr と要素数 n を受け取る。 // ネストした for ループを使ってソートを実装する。 外側のループは i を 0 から n-1 まで回し、
-
C++でストゥージソートを実装する方法:再帰的ソートアルゴリズムの解説とサンプルコード
ストゥージソート(Stooge Sort)は、与えられたデータを並べ替えるための再帰的なソートアルゴリズムです。配列をそれぞれ全体の2/3ずつが重なり合う2つの部分に分割し、「前半部分のソート → 後半部分のソート → 再び前半部分のソート」という3段階の手順で整列を行います。このアルゴリズムの最悪計算量は O(n^2.7095) であり、バブルソート(O(n²))よりも遅いという特徴があります。実用性は低いものの、再帰処理やアルゴリズムの学習教材として知られています。アルゴリズムの手順Begin データを入力として受け取る。 データ配列 a と要素数 n を引数として Stoog