C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C/C++の前方宣言(フォワード宣言)とは?使える場面と書き方を解説

    C/C++における前方宣言(フォワード宣言)とは、クラスや関数の完全な定義よりも前に、その存在だけをコンパイラへ伝える仕組みです。前方宣言を行うことで、それ以降のコードは「Personという名前のクラスが存在する」ということを認識できるようになります。コンパイラはその名前を見つけてもエラーを出さずに処理を進められ、実際のクラス定義は後の段階でリンカによって解決されます。前方宣言の基本的な例class Person; void myFunc(Person p1) { // ... } class Person { // ここにクラス定義を記述 };このコードがどう動くのかこの

  2. C++のスマートポインタとは?仕組みと使うべき場面をわかりやすく解説

    スマートポインタとは何かスマートポインタとは、C++の「生ポインタ(raw pointer/ベアポインタとも呼ばれます)」をラップするクラスのことです。生ポインタが指し示すメモリなどのリソースを自動的に管理する役割を担います。たとえば、プログラムのどこからもそのメモリ領域への参照が失われてしまった場合でも、スマートポインタは適切なタイミングでメモリを解放してくれます。この動作は、ガベージコレクタに似た働きをすると言えるでしょう。スマートポインタの主な種類C++には複数種類のスマートポインタが用意されており、標準ライブラリでは主に以下の3つが代表的です。std::unique_ptr所有権を1つ

  3. CおよびC++の最新標準規格ドキュメントはどこで入手できる?

    プログラミング言語の標準規格に沿った開発を行うには、公式の規格ドキュメントを参照することが重要です。ここでは、C言語およびC++の最新標準規格ドキュメントを入手できる場所を紹介します。 C標準規格ドキュメントの入手先 現在のC言語標準規格(ISO/IEC 9899)の公式ドキュメントは、ANSIが運営するオンラインストア「ANSI Webstore」から購入できます。以下のリンクからアクセスしてください。 https://webstore.ansi.org/RecordDetail.aspx?sku=INCITS%2FISO%2FIEC+9899-2012 C++標準規格ドキュメントの入手

  4. C++のキャスト演算子を使い分けよう!static_cast・dynamic_cast・const_cast・reinterpret_castの違いと使いどころ

    C++には、C言語形式のキャストとは異なる4種類のキャスト演算子が用意されています。それぞれ目的と安全性が異なるため、状況に応じて適切に使い分けることが重要です。本記事では、const_cast、static_cast、dynamic_cast、reinterpret_castのそれぞれの役割と使用場面を詳しく解説します。 const_cast:const性(定数性)の追加・除去 const_castは、変数に対してconstを取り除いたり、逆に追加したりするための専用キャストです。const指定された変数から定数性を外す必要がある場合や、定数性を付与したい場合に使用します。 ただし、本来書

  5. C++のシングルトンデザインパターンをわかりやすく解説!実装例とスレッドセーフな書き方

    シングルトンパターンとは シングルトンデザインパターンは、あるクラスのインスタンス生成を1つのオブジェクトだけに制限するソフトウェア設計パターンです。システム全体の動作を1つのオブジェクトで一元管理したい場合に特に有効です。 代表的な使用例として、ファイルへログを出力するロガーが挙げられます。ロガーのインスタンスが複数存在すると、同じファイルへの同時書き込みによる競合やログの分散といった問題が発生する可能性があります。そこでシングルトンクラスを利用すれば、ロガーを確実に1つだけに保つことができます。 基本的な実装例 次のコードは、C++でシングルトンクラスを実装した例です。 #include

  6. C++のポインタで別の関数からローカル変数にアクセスすることは可能?仕組みと危険性を解説

    C++において、ローカル変数はスコープを抜けた時点でアクセスできなくなります。それが「ローカル変数」というものの本質だからです。ただし、スコープ外でもローカル変数のメモリにアクセスできる「可能性がある」例を見てみましょう。サンプルコード#include<iostream> int* foo() {     int x = 3;     return &x; } int main() {     int* address = foo();  &nb

  7. C++でfloatとdoubleを比較する方法|許容誤差(EPSILON)を使った実装例

    C++においてfloat型やdouble型などの浮動小数点数を比較する方法は、最終的に何を実現したいかによって異なります。浮動小数点数は内部で2進数の近似値として表現されるため、「==」演算子による単純な等価比較では意図しない結果になることがあります。そこで一般的には、許容できる誤差(イプシロン)を設定し、その範囲内であれば同じ値とみなす手法が用いられます。 理論面に深入りしすぎず、すぐに使える関数が必要で、多少の計算誤差が許容できる場合は、以下のような関数が便利です。 サンプルコード #include<iostream> using namespace std; // 許容でき

  8. C/C++でビットを設定・クリア・反転する方法【サンプルコード付き】

    ビットの設定(セット)、クリア(解除)、反転(トグル)は、C、C++、Pythonなど、ビット演算をサポートするすべてのプログラミング言語で、ビット単位の演算子を使って行うことができます。また、目的のビットを正しい位置へ移動させるために、シフト演算子も併用します。 ビットを設定する 特定のビットを1に設定するには、ビットごとのOR演算子(|)を使用します。1を対象の桁数分だけ左にシフトし、元の値とORを取ることで、その位置のビットを確実に1にできます。 例 #include<iostream> using namespace std; int main() {  &nb

  9. C++でCSVファイルを読み込み・解析する2つの方法を解説

    C++でCSVファイルを解析する場合、自分でファイルを読み込んで処理するよりも、ライブラリを利用することを強くおすすめします。CSVは一見単純な形式に見えますが、引用符で囲まれたカンマやエスケープ処理など、考慮すべきケースが数多く存在します。自前で実装すると、こうしたエッジケースを見落としてしまう可能性が高くなります。 C++向けのBoostライブラリには、CSVファイルを読み込むための便利なツールセットが用意されています。 Boost.Tokenizerを使った解析方法 以下は、Boostのtokenizerとescaped_list_separatorを使用して、1行のCSVデータを解析す

  10. C++で文字列をトークン化(分割)する2つの方法を解説

    文字列のトークン化(分割)とは、1つの文字列を区切り文字(スペースやカンマなど)を基準に、複数の部分文字列へ分割する処理のことです。C++では、標準ライブラリだけでもいくつかの方法で実現できます。本記事では、代表的な2つの方法をサンプルコード付きで紹介します。方法1:stringstreamを使って空白で分割する1つ目の方法は、stringstreamを使ってスペースで区切られた単語を順に読み取る方法です。この方法はやや制限がありますが、適切なチェックを加えれば十分に目的を果たすことができます。サンプルコード#include <vector> #include <string

  11. 【C/C++】const int* と int* const の違いを徹底解説!宣言の読み方のコツも紹介

    はじめに:constとポインタの組み合わせ C/C++では、「const」と「ポインタ」を組み合わせた宣言が複数存在し、それぞれ意味が異なるため、初心者がつまずきやすいポイントの一つです。この記事では、代表的な4つのパターンを整理し、何が変更できて何が変更できないのかを具体例とともに解説します。 4つの基本パターン int* // intへのポインタ int const * // constなintへのポインタ int * const // intへのconstポインタ int const * const // con

  12. C++で仮想デストラクタを使うべき場面とは?ポリモーフィックな基底クラスの注意点

    『Effective C++』におけるスコット・マイヤーズの助言 スコット・マイヤーズは名著『Effective C++』の中で、仮想デストラクタについて次のように述べています。 「クラスが仮想関数をひとつでも持つなら、そのクラスは仮想デストラクタを持つべきである。一方、基底クラスとして設計されていないクラスや、ポリモーフィックに扱われることを意図していないクラスは、仮想デストラクタを宣言すべきではない」 つまり、ポリモーフィックな基底クラスでは、デストラクタを必ず仮想関数として宣言するのが原則です。 仮想デストラクタがないと何が起きるのか 問題が発生するのは、派生クラスのコンストラクタでオ

  13. C/C++における #include <filename> と #include "filename" の違い

    C/C++のプリプロセッサディレクティブである #include には、ヘッダファイルを指定する2つの記法があります。これらの根本的な違いは、プリプロセッサがファイルを探す場所(検索パス)にあります。 #include <filename>(角括弧) システム標準のヘッダファイルをインクルードする際に使用します。 プリプロセッサは、コンパイラがあらかじめ指定しているシステムインクルードディレクトリ(例: /usr/include、Visual StudioのVC/includeなど)を検索します。 検索順序やディレクトリの場所は実装(コンパイラ/環境)依存です。 主

  14. 【C++】new演算子で2次元配列を動的に宣言する方法を解説

    C++において、new演算子を使って2次元配列を動的に確保する方法は、メモリ管理の理解を深めるうえで重要なテクニックです。この記事では、基本的な仕組みから具体的なコード例、そして解放時の注意点までわかりやすく解説します。動的2次元配列の基本構造動的な2次元配列とは、本質的には「配列へのポインタ」を要素とするポインタ配列です。つまり、まずポインタへのポインタ(int**)の配列を確保し、その後ループ処理で各行に対応する1次元配列を個別に割り当てていくという手順になります。コード例:3×4の2次元配列を作成する#include<iostream> using namespace std

  15. 可変長配列(VLA)がC++標準に採用されない理由と代替手段「std::vector」の使い方

    可変長配列(VLA)とは可変長配列(Variable Length Array、VLA)とは、実行時にサイズが決まる配列のことです。C99では標準機能として採用されましたが、C++の標準規格には含まれていません。本記事では、その理由と、C++で代わりに利用できる方法を解説します。可変長配列がC++標準に採用されない理由スタックは通常、利用できる領域が非常に限られています。そのため、大きなサイズになりうる配列をスタック上に作成しなければならない状況は、プログラムの安定性の観点から好ましくありません。また、コンパイル時にサイズがわかっているのであれば静的配列を使えばよく、逆にサイズが事前にわからな

  16. C++の「3の法則」と「5の法則」をわかりやすく解説

    3の法則は、C++プログラミングにおける代表的な経験則の一つです。これは良いプラクティスに関する指針であり、クラスに次のいずれかを明示的に定義する必要があるならば、残りの2つも定義すべきである、というものです。 コピーコンストラクタ 代入演算子 デストラクタ なぜ3つすべてが必要なのか その理由は、これらのいずれかが必要になる場面では、クラスが動的に確保されたリソースを管理している可能性が非常に高く、その管理を正しく行うには他の関数も必要になるからです。 例えば、代入演算子が必要なケースを考えてみましょう。代入処理では、参照されているオブジェクトのコピーを作成することになり、新たにリソース

  17. C++11の「Rule of Five(5つのルール)」とは?リソース管理を正しく行うための基本原則

    C++における「Rule of Five(5つのルール)」は、リソース管理を適切に行うために適用される重要な原則です。リソース管理とは、管理対象オブジェクトのライフタイム(生存期間)をクライアント側が意識しなくても済むようにする仕組みであり、メモリリークなどの問題を未然に防ぐことができます。 しかし、この管理にはコストが伴います。「Rule of Five」の核心は、以下の5つの関数のうち1つでも自分で定義する必要があるならば、残りの4つについても適切な方針を定め、実装しなければならないというものです。 例えば、オブジェクト「Foo」を管理する「FooManager」というクラスを作成する場合

  18. C++98、C++03、C++0x、C++11の違いを徹底解説!各標準規格の特徴と進化の history

    C++標準規格の変遷を理解しようC++は1998年に最初の国際標準規格が制定されて以来、数年ごとに改訂を重ねながら進化を続けてきました。本記事では、C++98、C++03、C++0x、C++11という各規格の違いと、それぞれがもたらした変更点について詳しく解説します。C++98:最初の標準規格C++98は、C++における最初の公式標準規格(ISO/IEC 14882:1998)です。この規格によって、言語の基本的な構文体系、STL(Standard Template Library)、そして標準ライブラリの全体像が初めて定義されました。C++の土台となる重要な規格です。C++03:バグフィック

  19. C++の配置new(placement new)とは?使い方と仕組みを解説

    一言でいうと、配置new(placement new)は、すでに確保されているメモリ上にオブジェクトを「構築」するための機能です。新たにメモリを割り当て直さず、既存のメモリ領域を再利用できるため、パフォーマンス最適化の観点で非常に有用です。メモリ確保のコストを削減でき、処理速度の向上が期待できます。 配置newの基本構文 配置newは以下の形式で記述します。 new (address) (type) initializer この構文により、指定したアドレス上に、指定した型の新しいオブジェクトを構築できます。通常のnewと異なり、メモリの割り当ては行わず、与えられたアドレスに対してコンストラクタ

  20. C++0xとC++11の違いとは?標準規格の命名の経緯をわかりやすく解説

    標準規格の名前は「発行年」に由来するCおよびC++の標準規格は、通常、発行された年を冠した名前で呼ばれています。たとえばC++の場合、最初の標準規格は1998年に発行されたため「C++98」と呼ばれ、その最初の訂正版として2003年に発行されたものは「C++03」と呼ばれています。この命名規則に従えば、規格の正式名称が確定するまでは、暫定的な呼び名で策定中の規格を指すことになります。「C++0x」はまさにその暫定名称だったのです。なぜ「C++0x」という仮称が使われたのか次期改訂版の規格は、2008年までに完成させる予定でした。しかし、策定スケジュールに不確定な要素が多かったため、発行年を確定

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:12/300  20-コンピューター/Page Goto:1 6 7 8 9 10 11 12 13 14 15 16 17 18