1. TOP
  2. エンスタマガジン
  3. 学習
  4. 【C++初心者必見】C++を初めて学ぶ人向けに基礎知識、特徴、実行方法などを徹底解説!

【C++初心者必見】C++を初めて学ぶ人向けに基礎知識、特徴、実行方法などを徹底解説!


はじめまして、エンジニアスタイル編集部です!

コラムページでは、ITフリーランスに向けてお役立ち情報を発信します。Twitterではホットな案件を紹介してまいりますので、ぜひフォローをお願いいたします!
本記事が、皆様の参考になれば幸いです。

経験がまだ少ない方にもわかりやすく説明するために、初歩的な内容も記載しております。記事も長いので、実務経験豊富な方は、ぜひ目次から関心のある項目を選択してください。

エンジニアスタイルは、最高単価390万円、国内最大級のITフリーランス・副業案件検索サービスです。C++のフリーランス・副業案件一覧を以下からご覧いただけますのであわせてご確認ください。

C++言語とは

C++言語とは、コンパイル型の汎用プログラミング言語であるC言語の拡張版として開発されたプログラミング言語です。日本では「シープラプラ」「シープラ」などの名称で呼ばれており、主にPCソフトやモバイルアプリやWebアプリ・業務システムの開発で用いられます。具体的には、Googleの「Chrome」やゲーム開発に使われる「Unreal-Engine」、「amazon」等のECサイトなどがC++を用いて開発されています。

C言語にオブジェクト指向を追加した言語であるC++は、より効率よくプログラミングができるように作られています。C言語と互換性があり、ソフトウェア開発においては同時に使われることも多いです。

C++ を始める

まずは、C++を勉強するためのステップについて具体的にご紹介いたします。

先ほどお話した通り、C++はPCソフトやモバイルアプリ、業務システムなどの開発に使われるプログラミング言語です。習得することができれば、ソフトウェア開発の幅広い運用に適応することができるようになり、大きな自信とスキルを身につけることができるでしょう。

プログラミング言語の中では比較的習得が難しいと言われることもありますが、段階ごとに把握してみると、意外ととっつきにくさはありません。

IT業界のどこにいっても必要とされる人材を目指したいと考えている方は、ぜひC++を習得してみてください。

インストール

まず初めに、C++の開発環境を用意してみましょう。

C++の開発環境を用意するためには、プログラムコードを作成するエディターとプログラムコードから実行用ファイルを生成するコンパイラが必要となります。主流なのは「Visual Studio」です。「Visual Studio」は無料版の「Community」と有料版の「Enterprise」「Professional」に分かれていますが、個人で運用する分には「Community」で十分でしょう。

Visual StudioにMicrosoftアカウントでログインし、Visual Studio Communityの「ダウンロード」をクリックすると、インストールファイルをダウンロードすることができます。

その後コンポーネントを選択する画面で、「C++によるデスクトップ開発」を選択します。右下にあるインストールボタンをクリックすれば、インストールが始まります。

Hello World

Visual Studioをインストールできたら、早速プログラムを作成してみましょう。始めのうちは、長大なプログラムが必要となるものよりも、文字列を表示させるようなシンプルなものが学習に向いているかもしれません。

具体的な作成方法について紹介していきます。

Visual Studioを起動させ、「新しいプロジェクトの作成」をクリックしてください。「空のプロジェクト」を選択して、「次へ」をクリックします。プロジェクト名、場所、ソリューション名を設定したら、フォルダやファイルが生成されます。

メイン画面が起動するので、プログラムコードを記載するソースコードファイルの追加を行いましょう。ソースコードファイルは、ソリューションエクスプローラの「ソース」から追加することができます。

ファイルが生成されたら、プログラムコードを入力してください。入力が終わったら変更を保存しましょう。

保存完了後にプログラムを実行してみてください。コマンドプロンプトが起動し、「Hello World」と表示されたら成功です。

基本構文

C++を用いたプログラムが書けたところで、C++をさらに発展的に使用していけるよう、基本構文を学んでいきましょう。

こちらで紹介する文法は、C++を使ってソフトウェア開発を行う場合には絶対に必要となるものです。基礎を固めることで応用にチャレンジすることもできます。しっかりと学習していきましょう。

変数

変数とはある値に意味を持たせ、一定期間保存するための機能です。例えば、A=1と定めた場合には、Aは1を値に持つようになります。

C++における具体的な使い方は、

【変数の型】 【変数名】;

こちらで変数を宣言し、

【変数名】 = 【値】;

この書き方で値を代入します。

変数Aに0を代入するときの書き方は以下の通りです。

<型> a;

a = 0;

基本型

プログラミング言語における基本型とは、あらかじめ定められているデータの型のことを指します。

C++の基本型には以下のようなものがあります。

  • int
  • float
  • double
  • short
  • long
  • char
  • bool

上記の通り、変数にはint型やchar型などの種類に分かれています。数学で例えるなら、「Xは整数とする」の「整数」にあたる部分のイメージです。プログラムの内容によってこれらは使い分けていかなければなりません。それぞれの特徴をしっかりと把握してください。

リテラル

リテラルは、数値や文字列を直接に記述した定数のことです。変数の対義語であり、変更されないことが前提とされています。

リテラルは以下の種類に分類することができます。

  • 整数リテラル
  • 浮動小数点リテラル
  • ブーリアンリテラル
  • 文字リテラル
  • 文字列リテラル

リテラルはデータの種類によって表現の仕方が異なるため、上記のように分類されています。

ポインタと参照

ポインタと参照はC++でプログラミングを行う際に頻出する単語のうちの一つです。

どちらも変数や関数に関係していますが、変数のある場所(メモリ)を指すコンピュータ内の矢印の役割がポインタであり、そのなかでも数字による足し引きを不可能にしたものが参照です。

どちらも変数がある場所を表す矢印の役割を担ったものではありますが、ポインタはその位置を変更できるのに対し、参照は変更ができない点で異なっています。

コメント

C++ではプログラム内にコメントを残すことができます。

コメントを用いることでプログラムコード内に任意のテキストをメモや説明に残すことができるのです。コメントはコンパイル時に無視されるため、コードには影響しません。

業務を行う上でこういったコメントは必ず用いられます。

具体的な記入方法は以下の通りです。

/* テキスト */

上記は複数行にわたるコメントを残す場合に用いられる記入方法です。「テキスト」部分には任意の文が入ります。

単一行のコメントの場合は

// テキスト

こちらの方法が用いられることが多いです。

制御文

制御文とは、文字通りプログラムの動きを制御する命令を送る構文です。

C++における制御文には以下のようなものがあります。

  • if

条件分岐を行う

  • if-else

if( )の中が偽の場合の処理を指定する

  • for

繰り返しを行う

  • while

繰り返しを行う

  • do-while

繰り返しの中で{ }内の処理を1回は行う

  • break

ループを強制終了する

  • continue

それ以降の処理をスキップし、次の繰り返しに移る

  • switch

if文の複数バージョン

これらを覚えることはアルゴリズムを実装するうえで非常に重要です。業務でC++を使う上でも、これらの使い方を把握することは必須条件とされています。しっかりと学習していきましょう。

演算子

演算子とは足し算や掛け算などの計算や、値の大小を比較する際に使われる記号のことです。数学で言えば、+や-などの記号と同じ意味を持つものです。

C++における演算子は以下の通りです。

  • 等値演算子 (==、!=)
  • 関係演算子 (<、>、<=、>=)

これらの演算子は、変数同士の関係を設定する際に用います。プログラムを記述するうえで必要となるので、しっかりと覚えましょう。

関数

プログラミングの「関数」とは、与えられた値をもとに、定められた独自の処理を実行し、その結果を返す命令のことです。さらに具体的に言うと、何らかの操作を実行するコードのブロックのことを指しています。

C++は、関数の引数が異なれば同じ名前の関数を複数定義できる点で、ほかの言語よりも柔軟性に優れていると言われています。

C++における関数を用いたプログラム例は以下の通りです。


    int sum(int a, int b)
    {
        return a + b;
    }

こういったひとまとまり(ブロック)のことを関数と呼びます。ソフトウェア開発において関数に関する知識は必須となるので、しっかりと学習しておきましょう。

ラムダ式

ラムダ式とは関数を定義するかんたんな関数の書き方といったイメージです。ラムダ式を用いることで、複数行にわたる関数の記述をコンパクトにすることができます。

C++におけるラムダ式の基本構文は下記の通りです。

[キャプチャリスト](パラメータリスト) mutable 例外仕様 属性 -> 戻り値の型 { 関数の本体 }

ちなみに、不要部分は省略可能で最小構文はこのようになります。


[]{}

ラムダ式を習得することで、業務を効率化することもできます。業務の難易度が上がるにつれて、プログラムの行数も増えていくので、ラムダ式に関する学習は重要です。

コンテナ

IT業界における「コンテナ」とは、データやオブジェクトなどをまとめて格納するためのデータ構造やクラスなどの総称のことです。

C++においては、複数のオブジェクトをひとまとめにするためのC++の標準ライブラリに実装されている技術をコンテナと呼ぶことが多いです。

配列

配列は、C++ において複数の値を保存できる基本的な変数型の一つです。

配列を作成する場合は、あらかじめサイズを指定しておく必要があります。たとえば、10 個の要素からなる配列を宣言する場合は、


int arr [10]

といった形になります。

上記のような配列を宣言することで、int arr [0] から int arr [9] まで10 個の要素を保存するための領域が、メモリ上のどこかに確保されます。

文字列

C++ で標準に使用できる便利な文字列クラスに、std::stringがあります。

C言語やC++では、ダブルクォートで文字列リテラルを表し、通常配列に文字を格納し加工することができます。

strlen() など文字列の状態を返したり、sprintf() などの文字列を作成する関数なども用意されていますが、リテラル文字列は動的な操作に不向きとされています。

その点、std::stringは、通常文字列と同じように [] 演算子で文字を参照・代入することが可能で、サイズ情報等の取得や文字の挿入削除などもでき、柔軟性に優れています。

タプル

C++の場合、タプルとは構造体ペアを拡張したデータ構造のことを指します。

タプルは複数の要素を格納できるコンテナクラスです。要素のデータ型は異なっていても問題はありませんが、反面、要素の値を書き換えることはできません。

変数の宣言は以下のように行います。


tuple<データ型, ...> 変数名;
tuple<データ型, ...> 変数名(値, ...);

ペア

C++の場合、ペアは先ほど紹介したタプルと同様に、要素を格納できるコンテナクラスのことを指します。

ペアは2つの値をひとまとめにして扱うことができる型です。 別の言い方をすると、要素数が2つのタプルと同じように扱うことができます。

変数の宣言は以下のように行います。


pair<値1の型, 値2の型> 変数名;

ベクタ

C++におけるベクタとは、配列の長さを変えることができる配列のためのクラスのことです。

この長さを変えることができる配列のことを可変長配列といいます。

ベクタを用いた変数の宣言は以下のように行います。


std::vector<型> オブジェクト名;

マップ

マップとは、C++における連想配列クラスのことです。

キーと値を1セットとしてデータを保存することができますが、キーと値のほかに、枝分かれの情報も保持しているので、順序関係に関する情報も保持することとなります。

マップのクラス宣言は以下のように行います。


std::map<キー型, 値型> オブジェクト名;

キーと値の型を指定して宣言します。

一度作成したマップクラスの変数は、[] を使って、キーと値を格納することができます。

セット

C++におけるセットとは、順序付けされたデータを複数保持することができる順序付集合のコンテナクラスのことを指します。

データを順不同に順序付集合に追加すると、その値をキーにし自動的にソートして内部に格納することができます。

要素が常にソートされた状態の配列というイメージです。

宣言は以下の通りに行います。


std::set<型> オブジェクト名;

イテレータ

イテレータとはC++で用いられる抽象化されたポインタのことです。コンテナの要素を指し、移動、要素を参照・変更することが出来ます。

他のコンテナ型ではメモリのあちこちにデータが散らばって配置されていることがありますが、イテレータを用いるとポインタのように比較的簡単にデータを扱えるようになります。


std::vector<型>::iterator オブジェクト名;
オブジェクト名 = vec.begin();

先頭要素を指すイテレータを取得するにはbegin関数を使用します。

最後の要素はend関数で取得できます。

範囲 for

C++では、範囲をループし、各要素を変数に自動的に代入する「範囲 for」というものがあります。

範囲としては、通常配列・コンテナクラスオブジェクトを指定することができます。

書き方は以下の通りです。


for( 変数宣言 : 範囲)

ファイル分割とスコープ

プログラムの難易度が高くなっていくにつれて、ソースコードの長さは膨大になっていきます。そのような場合、単独の大きなソースファイルを複数の小さなソースファイル群へ分割することが必要になります。

これがIT業界におけるファイル分割です。そのなかでもC++におけるファイル分割は少し毛色が違います。オブジェクト指向言語であるC++は、クラスこそが中心の言語であるため、クラスの定義単位でファイルを分割します。

また、スコープはソースコード内の変数や関数が利用できる領域のことを指します。C++では、スコープ解決演算子を用いることで、名前空間内のシンボルを利用する事ができます。

宣言と定義

C++において、宣言と定義は意味が異なります。

宣言は、型の情報や名前などのシンボルの概要を示すことです。

一方定義とは、シンボルの詳細を示すことです。 定義があることで、そのシンボルが具体的にどういうものなのか分かります。 定義をした場合は、合わせて宣言が行われたことにもなります。

複数ファイル

1つのソースファイルにコードを書き続けていると、 コードが長くなった場合に、読みにくくなったり、書きにくくなったりするので、 適度にコードを複数のファイルに分ける必要があります。

C++は「ヘッダ」と呼ばれる関数のプロトタイプ宣言を記述するファイルと、「ソース」と呼ばれる関数の実装を記述するファイルの2種類を使うことになります。別々のファイルで1つのプログラムを書くことができるということです。

複数ファイルでプログラムを行うことで、記述の手間を減らし、コードを簡潔化することができます。

スコープ

プログラムは特定の範囲毎にシンボルを識別しています。C++ではこの範囲のことをスコープと呼びます。また、スコープを決める範囲のことをブロックと言います。ブロックは{}で囲まれた範囲が1つのブロックとしてカウントされます。

具体的に説明すると、


namespace 名前 {}

上記は名前空間スコープというものですが、この書き方をすることで、namespaceブロックで括られたシンボルが、その名前空間に属することを指示することが可能となります。

ほかにも関数スコープやブロックスコープ、グローバルスコープなど、さまざまな種類のスコープがあります。

内部リンケージ

宣言された同名のシンボルを同一のものとして扱うかどうかを示す概念のことをリンケージと言います。そのファイルの内部でしか利用できないものは内部リンケージを持つという言い方をします。

具体的に説明すると、プログラム上でシンボルの宣言に「static」指定子を付与することで内部リンケージを持たせることが出来ます。

inline 関数

inline関数はC++において処理の高速化で使用される手法の一つです。

通常の関数の呼び出しはアドレスに登録されている関数のポインタを使用してその関数先に移動し処理を実行しますが、inline関数を用いた場合は移動をせずに呼び出されたソースに関数がコンパイル時に展開されます。

戻り値の前に「inline」と記述することでinline関数として扱われます。

ストリーム操作

プログラミングにおけるストリームとは、抽象化されたデータの流れを指す言葉です。より分かりやすく言うと、データが出入りする領域をプログラムで操作できるように扱えるようにする、といったイメージです。

C++においては、ファイルの扱いに関する「ファイルストリーム」という概念が存在します。出力や読み書きなど、ファイルを操作するほとんどの機会で用いることとなります。

標準入出力

ファイルストリームを実行した際の基本的な入出力についてご紹介いたします。

「fstream」を使用することで、入力と出力を同時に行うことができます。先頭に「#include <fstream>」と記入することで、このコードを用いてファイルの入出力を行うことができるのです。

「fstream」は、出力専用の「ofstream」と入力専用の「ifstream」を合体させたようなもので、使い方も同じです。双方向ストリームと呼ばれることもあります。

ファイル操作

ファイルの位置の変更にはseekpメンバ関数を使用します。

seekpメンバ関数には以下のようなものがあります。

  • std::ios::beg
  • std::ios::cur
  • std::ios::end

また、ファイルの現在位置の取得にはtellpメンバ関数があります。C++を用いてファイルを操作する場合にはこれらの関数が必須となります。

メモリの管理

JavaやC#などのプログラミング言語ではメモリの管理は必要ありませんが、C++に関しては作業者自身がメモリの管理を行う必要があります。

C++は確保したメモリを不要になってもシステムが自動で解放してくれないのです。結果として、メモリが不足して確保できなくなるメモリリークという問題が発生します。

このメモリリークを引き起こさぬよう、C++を使用するときは作業者がコードを入力し、メモリを確保/解放する命令をしなければなりません。使用する命令は以下の通りです。

メモリ確保の命令:new

メモリ解放の命令:delete(配列の場合はdelete[])

クラス

クラスとは、クラスベースのオブジェクト指向ブログラミング言語の主要な概念の1つであり、データやデータへの参照変更を含む操作をまとめる手段のことを指す言葉です。オブジェクトの設計図に相当するものでもあります。

新しいクラスを定義することは新しい型を定義することを意味し、その型を使ってインスタンスを作成することができるようになります。

C++においてクラスとはデータメンバやメンバ関数などをメンバに持つデータ型です。クラスが持つ変数は「データメンバ」と呼ばれ、クラスが持つ関数は「メンバ関数」と呼ばれます。

ほかにも、C++のクラス独自の概念がいくつかあるので、詳しく解説していきます。

データメンバ

データメンバとは、クラスが持つ変数のことです。

基本型だけでなく、ポインター、参照、配列型、ビット・フィールド、 およびユーザー定義の型を含む他の型を用いて宣言されるメンバがデータメンバに含まれます。

たとえば、クラスAにとある型のデータメンバを持たせるときは、以下のように表記します。


    class A {
     public:
        <型> データメンバ;
    };

メンバ関数

メンバ関数とは、クラスが持つ関数のことです。

オブジェクトに所属する関数であり、言語によっては「メソッド」(method)など他の名称で呼ばれることもあります。

継承

継承とは、C++の重要な機能のうちの一つで、あるクラスの機能を受け継いで、新しいクラスを作り出す機能のことです。

うまく使うことができれば便利な機能ですが、コードが複雑化してしまうことも多いため、使用する際には注意が必要です。

継承の元となるクラスは基底クラス(スーパークラス、親クラス)と呼ばれます。メンバ関数がひとつだけの単純なクラスを基底クラスとすることが多いです。

次に新しいクラスを定義します。このクラスは派生クラス(サブクラス、子クラス)と呼ばれます。派生クラスこそが、基底クラスの機能を受け継ぐクラスです。

継承は基本的に「派生クラス名 : public 基底クラス名」という形で行います。

多態性

多態性とは、同じメソッド呼び出しに対して異なるオブジェクトが異なる動作をすることを言います。ポリモーフィズムと呼ばれることもあります。

多態性はアップキャストやダウンキャストなど、C++におけるさまざまな動作を包括的に指した言葉です。

アップキャストは派生クラスの参照やポインタから基底クラスの参照やポインタへの型変換が行われた状態のことです。

ダウンキャストは基底クラスの参照やポインタから派生クラスの参照やポインタへの型変換を意味します。

コンストラクタ

C++におけるコンストラクタとは、クラスの初期化を行うために定義された特別な関数のことです。

クラス名と同じ名前で戻り値の型の指定のない関数の形をしています。

コンストラクタは必ずしも何かを定義する必要はありませんが、その場合は何も初期化されません。

デストラクタ

C++におけるデストラクタは、終了処理を行うために定義することができる特別な関数のことです。「~+クラス名」という関数名で定義します。引数は指定しません。

デストラクタは、オブジェクトが自動的に破棄されるときや、オブジェクトを delete 演算子により明示的に破棄するときに必ず呼び出されます。そのためデストラクタは終了処理を記述するのに最適な関数です。

演算子オーバーロード

演算子とは「+」や「*」などプログラム上で演算を行うための記号です。

演算子を用いたプログラムを簡潔に、見た目もわかりやすく書くことができる機能こそが、演算子オーバーロードです。

演算子オーバーロードは「operator」に使用したい演算子を組み合わせることで定義することができます。

代入演算子

代入演算子とは、変数などに値を代入するためのものです。C++の場合は演算子オーバーロードの対象にもなります。代入演算子にはコピー代入演算子とムーブ代入演算子の2つがあります。

コピー代入演算子はオブジェクト「const」の左辺の値を引数として参照し、戻り値はコピー先オブジェクトの左辺の値を参照します。

一方、ムーブ代入演算子はムーブ元となるオブジェクトの右辺値を引数として参照し、ムーブ先オブジェクトの左辺値を戻り値として参照するという違いがあります。

default/delete

C++には、暗黙的に定義されることがある特別なメンバ関数が存在します。そのメンバ関数は以下の通りです。

  • デフォルトコンストラクタ
  • コピーコンストラクタ
  • コピー代入演算子
  • ムーブコンストラクタ
  • ムーブ代入演算子
  • デストラクタ

これらに対する指定として「default」指定と「delete」指定があります。

特別なメンバ関数に「default」をつけることで、暗黙的に定義されるものと同じものを明示的に定義できます。

また、同じく特別なメンバ関数に「delete」をつけることで、暗黙的に定義される特別なメンバ関数の削除を指定することができます。

static メンバ

staticデータメンバとは、クラスのオブジェクトごとではなく、クラスそのものがもつ変数のことです。

データメンバの宣言に「static」をつけることで staticデータメンバを宣言することができます。

また、クラスのオブジェクトごとではなく、クラスそのものがもつ関数のことをstaticメンバ関数といいます。

メンバ関数の宣言に「static」をつけることでstaticメンバ関数を宣言することができます。

構造体

構造体とは、クラスのアクセス指定子をデフォルトの「private」ではなく、「public」にしたもののことです。

具体的にいうと、


    struct A {
        <型> 名前;
        };

といったように、先頭の「class」を「struct」とすることにより、このクラスは構造体になります。

共用体

共用体は複数の型のどれかを格納したい、という場合に用いるものです。型の違うメンバを持つことができます。

メンバを持つ点で構造体と似ていますが、構造体のメンバはそれぞれアドレス先が異なるのに対して、共用体のメンバは一箇所に格納されている点で異なります。

キャスト

キャストとは、オブジェクトや値の型を別の型に変換することです。

C++のキャストには以下のようなものがあります。

  • static_cast 型変換を明示的に行う
  • dynamic_cast 基底クラス型のポインタと派生クラス型のポインタを変換する
  • const_cast const修飾を変化させる
  • reinterpret_cast 型情報だけ変える

テンプレート

テンプレートは、プログラマーがコードを書くだけで、そのコードが型の形式に準拠して広範囲の型に適用できるようにすることを目的としています。型やコンパイル時に定まる値をパラメータ化する機能のことを主に指します。

関数テンプレート

関数に対するテンプレートを関数テンプレートといいます。関数テンプレートの定義は以下の通りです。


template <typename 名前>

型をパラメータ化するには「typename」を使用します。関数を呼び出す際に、上の例における「名前」の型を決定します。

クラステンプレート

クラスに対するテンプレートをクラステンプレートといいます。使用する型をあいまいな状態で定義するクラスのことです。

テンプレートクラスの機能を使うと、複数の型に対応したクラスを作れます。 クラス名<型名> 識別子; で識別子がオブジェクト名になります。

クラステンプレートではテンプレート実引数を省略することはできません。

特殊化

テンプレートでは、テンプレート仮引数に当てはめる具体的な型に応じて、普通のクラスや関数をインスタンス化します。こうして生成されるクラスや関数のことを、特殊化と呼びます。

特殊化はコンパイラによって行われるため、 ヘッダファイルで関数テンプレートを使用する場合にはそのヘッダファイルで定義も行います。

エラー処理

ここでは、C++におけるエラー処理の方法について紹介していきます。

代表的なエラー処理の方法が「例外処理」です。例外処理とはプログラム実行中にエラーが発生した場合に、 後続の処理を行うのをやめてエラー発生時用の処理を行うための機能のことです。例外処理においてエラーを表すものを「例外」といいます。

例外処理を行った場合、プログラムはエラーが発生した箇所で例外を送出し、後続の処理を行うことを中断します。そして、送出された例外を捕捉し、エラー発生時用の処理を行います。

先ほど話した通り、C++において例外処理は代表的なエラー処理の方法です。ぜひ学習してみてください。

ビルドとライブラリ

ソースコードを材料として、ライブラリなどの成果物を作成することをビルドと呼びます。ライブラリは、ビルドの管理を楽にしたり他人の書いたプログラムを再利用したりするために、プログラムをいくつかの単位に分割する仕組みのことです。

ビルドはプリプロセス、コンパイル、リンクの3段階で行われます。

プリプロセスはコメントの削除やプリプロセッサディレクティブの解決など、コンパイルのための下準備を行うパートです。

コンパイルのパートではC++で書かれたプログラムを低水準の機械語ファイルに変換します。

最後に、作成された複数のオブジェクトファイルを1つにまとめる作業としてリンクを行います。

メモリレイアウト

C++ では以下の型のサイズが1バイトと規定されています。ただし、C++においては1バイトは8ビットとは限らない場合があるのです。これは非常に稀ですが、1バイト=8ビットではない場合を想定していることを表明する必要があることもあります。

単体テスト

C++で書かれたプログラムは「Google Test」を用いて単体テストを行うことが主流とされています。テストコードを記述し、実行ファイルを作成することによって、単体テストを実行することができます。

Google Testにはテスト関数というものが用意されているので、初歩的なテストであれば、初心者の方でも実行することができるでしょう。

デバッグ

デバッグとは、書かれているソースコードを1行ずつ実行してみるテストのことです。

C++にはコンパイラごとに対応するデバッガが存在します。

  • GCC GDB
  • Clang LLDB
  • Visual C++ CDB

デバッグを行う上で必要となるのがデバッグビルドです。通常のビルドはリリースビルドと呼ばれ、実行時に不要な情報を省いて最適化が行われています。しかし、デバッグに関してはリリースビルドで省かれる情報が必要となるため、専用のデバッグビルドを用いるのです。

ビルド自動化

ビルド自動化とは、言葉の通りビルド作成を自動化するためのプロセスです。

C++には2つの主流なビルド自動化ツールが流通しています。それが「Make」と「CMake」です。

Makeは専用のファイルを読み込み、コードを入力することでビルドを生成します。

CMakeはコンパイラに依存しない点が特徴です。

C++を利用するうえでどちらも非常に重要なので、使い方をしっかりと覚えておきましょう。

まとめ

今回はプログラミング言語・C++の主な使い方と、使用に関する一連の流れについて解説いたしました。いかがだったでしょうか?

C++は人気の高い言語ではあるものの、JavaやPythonなどと比べると使用人口は少ない傾向にあります。一方でアプリケーション開発やWebサービスの開発など、需要は高く、習得して損はないと言えるでしょう。

現場で活躍するには基礎をきちんと身につけることが重要です。将来性のある言語であるC++、ぜひ積極的に身につけてみてください。

SNSシェア
CATEGORY
学習
TAGS
新規会員登録エージェントとの初面談1社につきAmazonギフト券3,000円分全員にプレゼント!

あわせて読みたい関連記事


おすすめ&新着求人・案件


各種SNSで情報を
発信中フリーランスで働くエンジニアに役立つ情報を発信しています。
フリーランス求人・案件の選び方や注意点、単価を上げるコツなどをエンジニアスタイルの編集部が発信しています。
フォロー・友達に追加していただき最新の情報をGETしてください。