-
-std=c++11と-std=gnu++11の違いとは?GCCコンパイラオプションをわかりやすく解説
GNU C++コンパイラである g++ は、C++言語に対して独自の拡張機能(GNU拡張)を数多く提供しています。-std=c++11 と -std=gnu++11 の違いは、これらのGNU拡張機能を有効にするかどうかという点にあります。 2つのオプションの基本的な違い -std=gnu++11 を指定した場合、C++11の標準規格に加えて、GNU独自の拡張機能が有効になります。この中には、C++標準に厳密には準拠しない機能も含まれています。 一方、-std=c++11 を指定した場合は、C++11の標準規格に厳密に準拠するモードでコンパイルが行われます。そのため、標準に違反する可能性の
-
GCCにおけるC++標準規格のサポート状況と-std=オプションの使い方
GCCがサポートするC++標準規格GCC(GNU Compiler Collection)は、ISOによって策定・公開された複数のC++標準規格(方言)に対応しています。どの規格に基づいてコンパイルを行うかは、-std= コマンドラインオプションで選択できます。C++98 / C++031998年に制定された最初のC++標準規格です。2003年の改訂により「C++03」と改名され、その後の一部の欠陥報告も反映されています。GCCはこの規格を完全にサポートしています。C++11旧称は「C++0x」。2011年に公開されたC++標準規格で、ラムダ式やauto型推論など数多くの新機能が導入されました
-
C++11で導入された主な変更点を徹底解説
C++11とはC++11は、2011年に公開されたモダンC++の標準規格です。従来のC++に対して数多くの大型拡張と改善がもたらされ、現代のC++プログラミングの基礎となった重要なバージョンです。この記事では、C++11で追加・変更された主要な機能をわかりやすくまとめて紹介します。C++11の主要な変更点・追加機能一覧初期化リスト(Initializer lists)自動型推論(auto、decltype)右辺値参照とムーブコンストラクタconstexpr:一般化された定数式POD(Plain Old Data)の定義の変更統一初期化(Uniform initialization)範囲ベースf
-
C++11とは?モダンC++の基礎となる主要機能と変更点を徹底解説
C++11の概要C++11は、2011年に発表された現代のC++標準規格です。それまでの言語仕様に対して数多くの重要な拡張と改善をもたらし、現在のモダンC++の基礎となっています。この規格は国際標準化機構(ISO)により2011年8月12日に承認され、従来のC++03に取って代わりました。「C++0x」という名称の由来C++11はかつて「C++0x」という名称で知られていました。これは、次期標準規格が2008年までに完成する見込みだったものの、策定時期が不確実であったためです。「x」には8または9が当てはまる可能性があり、その柔軟性を持たせた命名でした。しかし計画は当初の想定より遅れ、最終的に
-
C++におけるPOD型とは?意味と特徴をわかりやすく解説
PODとは、C++における「Plain Old Data(プレーン・オールド・データ)」の略称です。POD型とは、メンバ変数のみを持ち、メンバ関数(メソッド)、コンストラクタ、デストラクタ、仮想関数などを一切持たない、シンプルなクラスや構造体のことを指します。POD型の条件クラスや構造体がPOD型とみなされるためには、主に以下のような要素を含んでいない必要があります。ユーザー定義のコンストラクタデストラクタコピー代入演算子などの特殊なメンバ関数仮想関数や仮想基底クラスコード例#include<iostream> using namespace std; // POD型の構造体 s
-
C++11のラムダ式とは?匿名関数の基本と使い方をわかりやすく解説
C++のSTL(標準テンプレートライブラリ)には、std::for_eachのような便利な汎用関数が多数含まれています。しかし、これらの関数は使い勝手がやや煩雑な場合があります。特に、適用したい関数オブジェクト(ファンクタ)がその関数専用の一時的なものである場合、そのためだけに名前付き関数を定義しなければならず、コードが冗長になりがちです。 この問題を解決するのが「匿名関数(無名関数)」です。C++11ではラムダ式が導入され、その場で簡単に匿名関数を作成できるようになりました。 ラムダ式の使用例 以下は、ラムダ式を使ってベクター内の各要素を2乗して出力する例です。 #include<io
-
C++のアグリゲート(集成体)とPOD(Plain Old Data)とは?定義と条件を解説
PODは、C++における「Plain Old Data(プレーン・オールド・データ)」の略称です。PODとは、メンバー変数のみを持ち、メンバー関数(メソッド)、コンストラクタ、デストラクタ、仮想関数などを一切持たないクラスや構造体のことを指します。C言語の構造体と同様の、シンプルで素朴なデータ構造をイメージすると分かりやすいでしょう。PODの例#include <iostream> using namespace std; // PODの例 struct MyStruct { int key; string data; }; int main() { s
-
C++標準におけるint型・long型のサイズはどのくらい?
C++標準では整数型のサイズは厳密に定められていない C++の言語仕様では、整数型のサイズをバイト単位で直接的に規定していません。その代わりに、「それぞれの型が最低限表現できなければならない値の範囲(最小値域)」のみが定められています。 そのため、実際のビット数は仕様書に明記されていませんが、この最小値域から必要な最小ビット数を簡単に導き出すことができます。 標準が保証する最小値域 参考として、C++標準が保証している主な整数型の最小要件は以下の通りです。 char:8ビット以上 short:16ビット以上 int:short以上のサイズ(通常16ビット以上) long:32ビット以上 l
-
C++で配列の範囲外にアクセスしてもエラーが発生しない理由とは?未定義動作の仕組みを解説
C++では、配列の範囲外にアクセスしてもプログラムが即座にエラーで停止することはありません。これはC++の重要な特徴であり、多くの初学者を戸惑わせるポイントでもあります。本記事では、その理由と背後にある設計思想、そして注意すべき「未定義動作」について詳しく解説します。C++には境界チェック(範囲チェック)がない最大の理由は、C++が配列の境界チェック(バウンズチェック)を行わないためです。JavaやPythonなどの言語は実行時に境界チェックを行うため、範囲外の要素にアクセスしようとすると例外やエラーが発生します。一方、C++は生の配列に対する境界チェックを一切行わず、指定されたメモリ位置にそ
-
C++で関数にオブジェクトを渡す5つの方法を徹底解説!値渡しからポインタ渡しまで
C++では、オブジェクトを関数へ渡す方法が複数あります。ここでは、クラス X を関数 fun に渡す場合を例に、代表的な渡し方とそれぞれの特徴・使い分けのポイントを解説します。用途に応じて適切な方法を選ぶことで、パフォーマンスやコードの安全性を高めることができます。 1. 値渡し(Pass by Value) オブジェクトの浅いコピー(シャローコピー)が関数のスコープ内に作成されます。関数内でどのような変更を行っても、呼び出し元のオブジェクトには一切影響しません。独立した作業用コピーが必要な場合に有効ですが、大きなオブジェクトの場合はコピーのコストに注意が必要です。 宣言 void fun(
-
C++で整数のオーバーフローを確実に検出する方法とは?
C++における整数オーバーフロー検出の基本整数のオーバーフローを安全に防ぐ唯一の方法は、オーバーフローが発生する前にチェックを行うことです。ただし、発生後のオーバーフローを検出するためのテクニックもいくつか存在します。符号なし整数の加算でオーバーフローを検出する方法符号なし整数(unsigned int)同士の加算でオーバーフローが起きたかどうかは、計算結果がどちらか一方の値より小さくなっていないかを確認することで判定できます。unsigned int x, y; unsigned int value = x + y; bool overflow = value < x; // 「val
-
C++のコンマ演算子とは?仕組みと使い方をサンプルコード付きで解説
コンマ演算子(カンマ演算子)は、複数の式を1つの式にまとめるための演算子です。コンマで区切られた式のリスト全体の値は、最も右側にある式の値になります。つまり、コンマ演算子の役割は、一連の処理を順番に実行させることにあります。左側の式の値はすべて破棄されるため、右端の式の評価結果が、コンマ区切り式全体の値として採用されます。サンプルコード次のプログラムは、コンマ演算子の動作を示したものです。#include <iostream> using namespace std; int main() { int i, j; &nbs
-
C++の構造体(struct)とクラス(class)の違いとは?デフォルトアクセス指定子と使い分けのポイントを解説
C++における構造体とクラスの基本的な違いC++では、struct(構造体)と class(クラス)は機能的にはほぼ同等であり、ほとんどの場面で互いに置き換えて使用できます。しかし、両者には明確な違いがひとつだけ存在します。それはメンバーおよび基底クラスのデフォルトのアクセスレベルです。1. デフォルトのアクセス指定子の違いstruct のメンバー変数やメンバー関数、そして基底クラスは、デフォルトで public(公開)になります。一方、class の場合は、デフォルトで private(非公開)となります。この違いは継承にも影響します。struct による継承はデフォルトで public 継
-
【C++入門】配列を関数に渡す3つの方法をわかりやすく解説
C++では、配列全体をそのまま関数の引数として渡すことはできません。しかし、インデックスを付けずに配列名を指定することで、配列へのポインタを渡すことができます。これは「配列名は先頭要素へのポインタに読み替えられる(配列の減衰)」というC++の仕組みによるものです。1次元配列を関数の引数として渡したい場合は、以下の3つのいずれかの方法で関数の仮引数を宣言します。どの方法でも、コンパイラに対して「整数型のポインタを受け取る」という情報が伝わるため、動作結果はすべて同じになります。配列を関数に渡す3つの宣言方法1. ポインタとして仮引数を宣言するvoid myFunction(int *param)
-
C++プログラミングで注意したい代表的な未定義動作(UB)一覧
C++では、標準規格上「未定義動作(Undefined Behavior:UB)」と定められている操作が数多く存在します。未定義動作を引き起こした場合、コンパイラはどのようなコードを生成してもよいことになっており、プログラムのクラッシュ、誤動作、最適化による予期しない挙動など、深刻な問題につながる可能性があります。 ここでは、C++プログラミングにおいて特によく見られる未定義動作の原因をまとめます。いずれも標準規格によって未定義動作と明記されているものであり、コードを書く際には必ず回避するようにしましょう。 よくある未定義動作の原因 符号付き整数のオーバーフローintなどの符号付き整数型で
-
C++で2次元配列を関数に渡す3つの方法を解説
C++では、配列全体をそのまま関数の引数として渡すことはできません。しかし、配列名をインデックスなしで指定することで、配列へのポインタを引数として渡すことは可能です。2次元配列を関数に渡す方法は、主に以下の3つがあります。1. 2次元配列の列のサイズを指定する最も一般的な方法です。関数の引数として、2次元配列の列数を明示的に指定して渡します。void processArr(int a[][10]) { // 何らかの処理 }2. ポインタを格納した配列を渡すポインタの配列を引数として渡す方法です。呼び出し側では、各行を動的に確保したポインタ配列を用意します。void processAr
-
C++のキャスト徹底解説:static_cast・dynamic_cast・通常キャストの違いと使い分け
C++には複数のキャスト演算子が用意されており、それぞれ目的と安全性が異なります。ここでは、static_cast、dynamic_cast、そして通常のキャスト(Cスタイルキャスト)の違いを中心に、その他のキャスト演算子についても詳しく解説します。主な3つのキャストstatic_cast通常の型変換を行うためのキャストです。暗黙的な型変換が行われる場面に対応しており、明示的に指定することもできます。float から int への変換、char から int への変換など、基本的な数値型間の変換に使用します。double d = 3.14;int i = static_cast<int&
-
C++の前方宣言とは?仕組みと使い方をわかりやすく解説
前方宣言(Forward Declaration)とは、クラスや関数の完全な定義よりも前に、その名前だけをあらかじめコンパイラに伝えるための宣言です。これにより、定義がまだ登場していない時点でも、その名前をコード内で使用できるようになります。 前方宣言の基本的な仕組み 前方宣言を行うことで、それ以降に続くコードは「Personという名前のクラスが存在する」ことを認識できます。コンパイラはこの名前を目にしてもエラーを発生させることなく処理を進められます。その後、リンクの段階で実際のクラス定義と結び付けられる仕組みです。 コード例 class Person; void myFunc(Pers
-
C/C++でグローバル変数を避けるべき理由とは?
グローバル変数はなぜ避けるべき?グローバル変数の使用は、C++に限らずあらゆるプログラミング言語において避けるべきとされています。その最大の理由は、グローバル変数がグローバル名前空間を汚染する点にあります。さらに、どのファイルからでもアクセスでき、プログラム内のどこからでも値を変更できるため、大規模プロジェクトでは深刻で厄介なバグを引き起こす原因となります。グローバル変数が問題視される主な理由コードのどこからでも変更可能:プログラム全体における使用箇所や影響範囲を把握し、動作を正確に推論することが非常に困難になります。アクセス制御が不可能:private や protected のようなアクセ
-
C++における「struct」と「typedef struct」の違いとは?
```html 結論:C++では両者に実質的な違いはない C++において、「struct」を使った宣言と「typedef struct」を使った宣言の間には、実質的な違いがありません。その理由は、C++ではstruct、union、enum、classによるすべての宣言が、暗黙的にtypedefされたものと同じように扱われるためです。ただし、同じ名前を持つ別の宣言によってその名前が隠されている場合を除きます。 なぜ違いが生まれないのか C言語では、構造体を宣言しただけでは型名として直接使えず、「struct タグ名」という形式で記述する必要がありました。そのため、変数宣言のたびにstructキ