• 検索結果がありません。

OSS モデルカリキュラムの学習ガイダンス 3. IT 知識体系との対応関係 4-3- 基 C++ に関する知識 と IT 知識体系との対応関係は以下の通り 科目名 基本レベル 基 C++ に関すオブジェクト指る知識向

N/A
N/A
Protected

Academic year: 2021

シェア "OSS モデルカリキュラムの学習ガイダンス 3. IT 知識体系との対応関係 4-3- 基 C++ に関する知識 と IT 知識体系との対応関係は以下の通り 科目名 基本レベル 基 C++ に関すオブジェクト指る知識向"

Copied!
23
0
0

読み込み中.... (全文を見る)

全文

(1)

4-3-基 C++に関する知識

1. 科目の概要

C を拡張してオブジェクト指向の概念を取り入れたプログラミング言語である C++の基 本的な知識を解説する。C++プログラムの構造、型、演算子や標準的なプログラム記述方法、 ライブラリを利用したプログラミングなどについて説明する。

2. 習得ポイント

本科目の学習により習得することが期待されるポイントは以下の通り。 習得ポイント 説 明 シラバスの対応コマ 4-3-基-1. オブジェクト指向の概念 C++プログラミングの前提となるオブジェクト指向の概念について解説する。データ自 身だけでなくデータの処理方法まで含めてオブジェクトに全てが属するという根本的 な考え方と、各種の用語、型による抽象的なデータ操作などについて説明する。 1 4-3-基-2. C++の基本 C++の歴史や特徴、C++による開発事例を解説する。また、C++によるプログラムを開 発する手順として、エディタによるプログラム作成からコンパイル、プログラム実行まで の流れを説明し、簡単なC++プログラム作成例を紹介する。更に変数やデータ型のC から拡張された部分を説明する。 2 4-3-基-3. クラス C++プログラム構成の概要を説明し、C++で導入されているオブジェクト指向の特徴に ついて述べる。更に、C++によるオブジェクト指向プログラミングの実現方法について 解説し、C++におけるクラスの定義方法、コンストラクタ、デストラクタなどについて説明 する。 3,4 4-3-基-4. オーバーロード C++プログラミングを特徴付ける関数の使用方法と、関数のオーバーロードや演算子のオーバーロードについて解説する。またフレンド関数やフレンドクラスについて解説 し、演算子のオーバーロードにフレンド関数を使用することの利点を説明する。 5,6 4-3-基-5. 継承と多相性 C++における継承の概念と、基底クラスから派生クラスを作成する方法を解説し、継承 の形態による継承後の属性の変化を説明する。また、オーバーライドの使用方法を解 説し、仮想関数を利用した多相性の実現方法を説明する。 7 4-3-基-6. 抽象クラス・多重継承 関数の実体を持たない純粋仮想関数を少なくともひとつは持つ抽象クラスの概念を説 明し、更にインタフェースクラスを解説する。また、複数のクラスを継承する多重継承 と、継承の重複を回避する仮想基底クラスについて解説する。 8,13 4-3-基-7. テンプレート C++におけるジェネリックプログラミングの実現手法として、テンプレートの概念と利便 性を解説し、ソースコードの生成を自動化する関数テンプレートの定義方法と、要素 の型が任意となるクラステンプレートの定義方法を解説する。またクラステンプレートの 例としてstringクラスを解説する。 9,13 4-3-基-8. 例外・名前空間・キャスト・変換関数 C++における動的エラーの統一した処理として例外処理を説明する。その他、名前空間の詳細を解説し、プログラムの実行時にデータ型を取得する実行時型情報の取得 方法や、Cにはないキャストの方法、更に変換関数を解説する。 10,11 4-3-基-9. 入出力 Cでの入出力をC++でサポートしていることを説明し、C++の入出力システムとの違いを解説する。更に、定義済みマニピュレータとマニピュレータの作成方法、また抽出演算 子や挿入演算子のオーバーロードの方法を解説する。 12

4-3-基-10. Standard Template Library コンテナ、イテレータ、アルゴリズムのライブラリ化といった概念を説明し、C++によるその実装であるSTL (Standard Template Library)を紹介する。またSTL によるプログラミ

ング例を挙げ、STL の具体的な使い方を解説する。 14,15

(2)

3. IT 知識体系との対応関係

「4-3-基 C++に関する知識」と IT 知識体系との対応関係は以下の通り。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 4-3-基 C++に関す る知識 オブジェクト指向の概念 C++の基本 クラスの定義 クラスの詳細 関数のオーバーロード 演算子のオーバーロード 継承と多相性 抽象クラス・多重継承 テンプレート キャスト・名前空間 例外・変換関数 入出力 演習(アルゴリ ズムとデータ構 造の実装) STLの概要 アルゴリズムと データ構造の使 用 科目名 基本レベル <IT 知識体系上の関連部分> 科目名 1 2 3 4 5 6 7 8 9 10 11 12 13 1 IT-IAS 情報保証 と情報セキュリ ティ IT-IAS1.基礎的 な問題 IT-IAS2.情報セ キュリティの仕 組み(対策) IT-IAS3.運用上 の問題 IT-IAS4.ポリ シー IT-IAS5.攻撃 IT-IAS6.情報セ キュリティ分野 IT-IAS7.フォレ ンジック(情報証 拠) IT-IAS8.情報の 状態 IT-IAS9.情報セ キュリティサー ビス IT-IAS10.脅威分 析モデル IT-IAS11.脆弱性 2 IT-SP 社会的な 観点とプロ フェッショナル としての課題 IT-SP1.プロ フェッショナル としてのコミュ ニケーション IT-SP2.コン ピュータの歴史 IT-SP3.コン ピュータを取り 巻く社会環境 IT-SP4.チーム ワーク IT-SP5.知的財産 権 IT-SP6.コン ピュータの法的 問題 IT-SP7.組織の中 のIT IT-SP8.プロ フェッショナル としての倫理的 な問題と責任 IT-SP9.プライバ シーと個人の自 由 3 IT-IM 情報管理IT-IM1.情報管理の概念と基礎 IT-IM2.データ ベース問合わせ 言語 IT-IM3.データ アーキテクチャ IT-IM4.データモ デリングとデー タベース設計 IT-IM5.データと 情報の管理 IT-IM6.データ ベースの応用分 野

4 IT-WS Webシステムとその技術 IT-WS1.Web技術 [1-Ⅰ-7] IT-WS2.情報アー キテクチャ [1-Ⅰ-7] IT-WS3.デジタル メディア IT-WS4.Web開発 IT-WS5.脆弱性 IT-WS6.ソーシャ ルソフトウェア 5 IT-PF プログラミング基礎 IT-PF1.基本データ構造 IT-PF2.プログラ ミングの基本的 構成要素 IT-PF3.オブジェ クト指向プログ ラミング IT-PF4.アルゴリ ズムと問題解決 IT-PF5.イベント 駆動プログラミ ング IT-PF6.再帰 6 IT-IPT 技術を統 合するためのプ ログラミング IT-IPT1.システ ム間通信 [1-Ⅰ-3] IT-IPT2.データ 割り当てと交換 IT-IPT3.統合的 コーディング IT-IPT4.スクリ プティング手法 IT-IPT5.ソフト ウェアセキュリ ティの実現 IT-IPT6.種々の 問題 IT-IPT7.プログ ラミング言語の 概要

7 CE-SWE ソフトウェア工学 CE-SWE0.歴史と概要 CE-SWE1.ソフトウェアプロセス CE-SWE2.ソフト ウェアの要求と 仕様 CE-SWE3.ソフト ウェアの設計 CE-SWE4.ソフト ウェアのテスト と検証 CE-SWE5.ソフト ウェアの保守 CE-SWE6.ソフト ウェア開発・保 守ツールと環境 [1-Ⅰ-4] CE-SWE7.ソフト ウェアプロジェ クト管理 CE-SWE8.言語翻 訳 CE-SWE9.ソフト ウェアのフォー ルトトレランス CE-SWE10.ソフト ウェアの構成管 理 CE-SWE11.ソフ トェアの標準化 [1-Ⅰ-6] 8 IT-SIA システム インテグレー ションとアーキ テクチャ IT-SIA1.要求仕 様 IT-SIA2.調達/手 配 IT-SIA3.インテ グレーション [1-Ⅰ-4] IT-SIA4.プロ ジェクト管理 IT-SIA5.テスト と品質保証 IT-SIA6.組織の 特性 IT-SIA7.アーキ テクチャ 9 IT-NET ネットワーク IT-NET1.ネット ワークの基礎 IT-NET2.ルー ティングとス イッチング IT-NET3.物理層 IT-NET4.セキュ リティ IT-NET5.アプリ ケーション分野 [1-Ⅰ-5] IT-NET6.ネット ワーク管理 CE-NWK0.歴史と 概要 CE-NWK1. 通信 ネットワークの アーキテクチャ CE-NWK2.通信 ネットワークの プロトコル CE-NWK3.LANと WAN CE-NWK4.クライ アントサーバコ ンピューティン グ [1-Ⅰ-3] CE-NWK5.データ のセキュリティ と整合性 CE-NWK6.ワイヤ レスコンピュー ティングとモバ イルコンピュー ティング CE-NWK7.データ 通信 CE-NWK8.組込み 機器向けネット ワーク CE-NWK9.通信技 術とネットワー ク概要 CE-NWK10.性能評 価 CE-NWK11.ネット ワーク管理 CE-NWK12.圧縮と 伸張 CE-NWK13.クラス タシステム CE-NWK14.イン ターネットアプ リケーション [1-Ⅰ-5,7] CE-NWK15.次世代 インターネットCE-NWK16.放送 11 IT-PT プラットフォーム技術 IT-PT1.オペレー ティングシステ ム [1-Ⅰ-3] IT-PT2.アーキテ クチャと機構 IT-PT3.コン ピュータインフ ラストラクチャ IT-PT4.デプロイ メントソフト ウェア [1-Ⅰ-4] IT-PT5.ファーム ウェア IT-PT6.ハード ウェア 12 CE-OPS オペレーティングシステ ム CE-OPS0.歴史と 概要 CE-OPS1.並行性 CE-OPS2.スケ ジューリングと ディスパッチ CE-OPS3.メモリ 管理 CE-OPS4.セキュ リティと保護 CE-OPS5.ファイ ル管理 CE-OPS6.リアル タイムOS CE-OPS7.OSの概 要 CE-OPS8.設計の 原則 CE-OPS9.デバイ ス管理 CE-OPS10.システ ム性能評価 コ ン ピュー タ ハー ド ウェ ア と アー キ テ ク チャ 13 CE-CAO コン ピュータのアー キテクチャと構 成 CE-CAO0.歴史と 概要 CE-CAO1.コン ピュータアーキ テクチャの基礎 CE-CAO2.メモリ システムの構成 とアーキテク チャ CE-CAO3.インタ フェースと通信 CE-CAO4.デバイ スサブシステム CE-CAO5.CPUアー キテクチャ CE-CAO6.性能・ コスト評価 CE-CAO7.分散・ 並列処理 CE-CAO8.コン ピュータによる 計算 CE-CAO9.性能向 上 14 IT-ITF IT基礎 IT-ITF1.ITの一 般的なテーマ [1-Ⅰ-4] IT-ITF2.組織の 問題 IT-ITF3.ITの歴史 IT-ITF4.IT分野 (学科)とそれに 関連のある分野 (学科) IT-ITF5.応用領 域 IT-ITF6.IT分野 における数学と 統計学の活用 CE-ESY0.歴史と 概要 CE-ESY1.低電力 コンピューティ ング CE-ESY2.高信頼 性システムの設 計 CE-ESY3.組込み 用アーキテク チャ CE-ESY4.開発環 境 CE-ESY5.ライフ サイクル CE-ESY6.要件分 析 CE-ESY7.仕様定 義 CE-ESY8.構造設 計 CE-ESY9.テスト CE-ESY10.プロ ジェクト管理 CE-ESY11.並行設 計(ハードウェ ア、ソフトウェ ア CE-ESY12.実装 CE-ESY13.リアル タイムシステム 設計 CE-ESY14.組込み マイクロコント ローラ CE-ESY15.組込み プログラム CE-ESY16.設計手法 CE-ESY17.ツールによるサポート CE-ESY18.ネット ワーク型組込み システム CE-ESY19.インタ フェースシステ ムと混合信号シ ステム CE-ESY20.センサ

技術 CE-ESY21.デバイスドライバ CE-ESY22.メンテナンス CE-ESY23.専門システム CE-ESY24.信頼性 とフォールトト レランス 複 数 領 域 に ま た が る も の 15 CE-ESY 組込みシステム ソ フ ト ウェ ア の 方 法 と 技 術 シ ス テ ム 基 盤 10 CE-NWK テレコ ミュニケーショ ン 分野 組 織 関 連 事 項 と 情 報 シ ス テ ム 応 用 技 術

(3)

4. OSS モデルカリキュラム固有の知識

OSS モデルカリキュラム固有の知識として、C++言語を用いた開発手法や、Linux 上で

の標準入出力、ファイル入出力、STL を扱うための知識がある。また、OSS である vi エデ

ィタ、g++(gcc コンパイラ(GNU Compiler Collection))を用いた開発の流れを学ぶ。

科目名 第1回 第2回 第3回 第4回 第5回 第6回 第7回 (1) オブジェクトとは (1) C++の説明 (1) クラスの定義 (1) クラスの詳細 (1) C++における関 数の特徴 (1) 演算子のオー バーロード (1) 継承 (2) オブジェクト指 向 (2) C++による開発 の流れ (2) オブジェクトの 生成と使用 (2) 動的生成 (2) 関数のオー バーロード (2) フレンド (2) 仮想関数と多相 性 (3) オブジェクトと関 数 第8回 第9回 第10回 第11回 第12回 第13回 第14回 第15回 (1) 抽象クラス (1) テンプレート (1) 実行時型情報 (1) 例外 (1) C++における入 出力システムの説 明 (1) オブジェクト指 向プログラミングの 演習 (1) STLの概要 (1) アルゴリズム (2) 多重継承 (2) stringクラス (2) キャスト (2) 変換関数 (2) ファイル入出力 (2) ジェネリックプロ グラミングの演習 (2) イテレータとコン テナ (2) リスト (3) 名前空間 (3) ベクトル (4) マップ 4-3-基C++に関する 知識 (網掛け部分はIT 知識体系で学習できる知識を示し、それ以外は OSS モデルカリキュラム固有の知識を示している)

(4)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-1. オブジェクト指向の概念 対応する コースウェア 第 1 回 オブジェクト指向の概念

4-3-基-1. オブジェクト指向の概念

C++プログラミングの前提となるオブジェクト指向の概念について解説する。データ自身だけでなく データの処理方法まで含めてオブジェクトに全てが属するという根本的な考え方と、各種の用語、 型による抽象的なデータ操作などについて説明する。 【学習の要点】 * オブジェクトとは「属性」「操作」「関係」「アイデンティティ」の特性を満たしたものである。 * 同じ特性を持つオブジェクトの集合を抽象化したものを「クラス」といい、クラスに属するオブジェ クトの例を「インスタンス」という。 * オブジェクト指向の基本的な技術としては「カプセル化」「継承」「多相性」がある。 図 4-3-基-1 オブジェクト指向の概念

(5)

1) オブジェクトとは オブジェクトとは「属性」「操作」「関係」「アイデンティティ」の特性を満たしたものである。 * 属性 オブジェクトは固有の形や性質などを持っている。 * 操作 オブジェクトは固有の振る舞いを持っている。 * 関係 オブジェクトは単独で存在することはなく、必ず他のものと関係を持っている。 * アイデンティティ オブジェクトは他のものと区別するためのアイデンティティを持っている。 2) クラスとインスタンス オブジェクトに関連する概念として「クラス」と「インスタンス」がある。 * クラス オブジェクトの属性や操作の雛形を定義したものをクラスといい、クラスの定義はオブジェクトの 集合である内包クラスとオブジェクトの抽象化である外延クラスの2つに分けられる。 * インスタンス クラスから生成されるオブジェクトの実体のことをインスタンスと呼ぶ。 3) オブジェクト指向 オブジェクト指向では、実現する機能を、個々に属性と操作を持った「オブジェクト」として実装す る。 またオブジェクト指向開発とは、オブジェクトの集まりを基本に開発を進める開発手法である。 オブジェクト指向の基本的な要素としては「カプセル化」「継承」「多相性」がある。 * カプセル化 オブジェクト同士の関係動作を、メッセージのみで行い、属性の詳細を隠ぺいすることを、カプ セル化といい、他のオブジェクトからの変更を防ぐと共に、オブジェクト内部に変更があった場 合でも他のオブジェクトへの影響を抑えることが可能となる。 * 継承 基本オブジェクトの特性を引き継いで派生オブジェクトを定義することを継承という。基本となる オブジェクトから継承したオブジェクトは新しい属性や操作を持つことができる。 * 多相性 基本オブジェクトで定義されている操作を、派生オブジェクトが持っている属性の型に応じて異 なる処理が行われるように操作の実装を変化させることを多相性という。

(6)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-2. C++の基本 対応する コースウェア 第 2 回 C++の基本

4-3-基-2. C++の基本

C++の歴史や特徴、C++による開発事例を解説する。また、C++によるプログラムを開発する手順と して、エディタによるプログラム作成からコンパイル、プログラム実行までの流れを説明し、簡単な C++プログラム作成例を紹介する。更に変数やデータ型の C から拡張された部分を説明する。 【学習の要点】

* C++は、AT&T ベル研究所の Bjarne Stroustrup 博士が、事象駆動型のシミュレーションを記述 するため C を拡張した言語として開発した。 * C++は、C にオブジェクト指向の概念を取り入れた。 * オープンソースソフトウェアの C++コンパイラとしては g++(gcc)がある。 * C++は、C に参照型や const 型等の機能を追加した。 * C++では変数をプログラム内のどこでも宣言することができる。宣言した変数のスコープは宣言 したブロック内となる。 図 4-3-基-2 C++のプログラミング

(7)

1) C++の誕生 C を始めこれまでのプログラム言語は、最初にデータの定義を行いそのデータを処理する手続きを 記述する手続き型の言語であったため、現実の事象を表そうとしたときにデータの定義や手続きの 記述が複雑になってしまう問題があった。 関連するデータとこれを用いる処理を 1 つのグループにまとめたオブジェクトにすることにより、現実 の事象を表した理解しやすいプログラムを記述できると考え、オブジェクト指向の概念が生まれた。 C++は AT&T ベル研究所の Bjarne Stroustrup 博士が、事象駆動型のシミュレーションを記述する ため C にオブジェクトを定義するクラスを始めとした新たな機能を追加し改良を行った言語である。 C++は C で開発されたプログラムを利用でき、他の言語よりも効率よく処理を行えることから急速に 普及した。 2) C++の特徴 C++の主な特徴としては以下のような点が挙げられる。 * オブジェクト指向 C++の最大の特徴としては、オブジェクト指向の概念であるデータと命令をクラス内で組み合わ せるという機能が追加されたことである。 * 参照型 定義済みの変数を用いて参照型の変数を定義することにより、変数の別名として使用すること ができる。関数の引数として指定した場合、呼出し元で定義された変数を関数内で変更するこ とが可能となる。 * const 型 const 型で変数を定義することにより、プログラム内で変更が出来ない変数として定義する。 * 新しいデータ型

C++では、true または false の値を持つ「bool 型」が追加された。 * 変数の宣言とスコープ C++では変数をプログラム内のどこでも宣言することができる。宣言した変数のスコープは宣言 したブロック内となる。 3) C++を利用したプログラム開発 C++は C と同様にソースコードをコンパイルして実行可能なファイルを作成することによりプログラム を作成する。オープンソースソフトウェアの C++コンパイラとしては g++(gcc)が利用できる。 * 作成手順 Linux における C++プログラムの作成手順としては以下のような流れになる。 - テキストエディタでソースコードを記述。 - g++(gcc)にてソースコードのコンパイルとリンクを行い、実行ファイルを作成。 - 実行ファイルの実行。

(8)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-3. クラス 対応する コースウェア 第 3 回 クラスの定義 第 4 回 クラスの詳細

4-3-基-3. クラス

C++プログラム構成の概要を説明し、C++で導入されているオブジェクト指向の特徴について述べ る。更に、C++によるオブジェクト指向プログラミングの実現方法について解説し、C++におけるクラ スの定義方法、コンストラクタ、デストラクタなどについて説明する。 【学習の要点】 * オブジェクト指向へ対応するため、構造体にそのデータを扱うための関数をあわせたクラスの定 義を行う。 * オブジェクトは状態を保持するためのメンバ変数と、オブジェクトの動作を定義するためのメンバ 関数で構成され、これらをクラスによって定義する。 * クラスには、初期化を行うコンストラクタ、終了処理を行うためのデストラクタという特殊なメンバ関 数を定義することができる。 * クラスのメンバを外部に公開するか否かを決めるアクセス制限は、カプセル化を実現する。 図 4-3-基-3 C++プログラムの構成

(9)

1) クラスの定義 クラスはオブジェクトの状態を保持するためのメンバ変数と、オブジェクトの動作を定義するための メンバ関数を定義したものである。 通常は1つのソースファイルに1つのクラスの定義を記述する。 ソースファイルは、クラスのプロパティとメソッドのプロトタイプを記述した宣言部分と各メソッドの本 体を記述する関数部分に分けられる。 宣言部分では「class」キーワードにより「class クラス名」のようにクラスの宣言を行う。アクセス識別 子(public、private、protected)を指定し、プロパティおよびメソッドのアクセス制限を設定することが できる。アクセス制限は、カプセル化を実現する手法である。 - public :クラス外の誰でもアクセス可能。 - private :クラス内のみアクセス可能。 - protected :クラス内および派生クラス内のみアクセス可能。 関数部分ではスコープ解決演算子「:: 」を用いて「クラス名::メソッド名」のように関数の記述を行う。 C では関連するデータをまとめて管理する場合、構造体の定義によって実装を行い、この構造体を 操作する処理は個別に関数の作成を行う。C++では構造体と個別の関数で実装していたものを、 以下のようにクラスとしてひとまとめにして実装することができる。 * 記述例 class sample { private: int count; int data[100]; pubulic:

void func1(int item); };

void stack::func1(int item){ … } 2) コンストラクタとデストラクタ クラスからインスタンスを生成する時に呼び出される関数をコンストラクタ、インスタンスが破棄される ときに呼び出される関数をデストラクタと呼ぶ。 コンストラクタの名称はクラスの名称と同じもので定義する。コンストラクタは通常の関数と同様に引 数を持つことが可能であるが、戻り値を持たない関数である。 デストラクタの名称はクラスの名称の前にチルダ「~」をつけたもので定義する。デストラクタは引数も 戻り値も持たない関数である。クラスの定義で、デストラクタを明示的に定義していない場合、コン パイラによって自動的に生成される。

(10)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-4. オーバーロード 対応する コースウェア 第 5 回 関数のオーバーロード 第 6 回 演算子のオーバーロード

4-3-基-4. オーバーロード

C++プログラミングを特徴付ける関数の使用方法と、関数のオーバーロードや演算子のオーバーロ ードについて解説する。またフレンド関数やフレンドクラスについて解説し、演算子のオーバーロー ドにフレンド関数を使用することの利点を説明する。 【学習の要点】 * 関数のオーバーロードは、関数名が同一で、引数の型、数、並び順が異なる関数を複数定義 することである * 関数の引数を省略した場合、自動的に void 型となる。また関数定義またはプロトタイプ宣言に てデフォルト引数の指定ができる。 * クラスの演算において、プログラマが自然な表現で理解しやすく記述できるように、+や-など の演算子の処理内容を再定義することが、演算子のオーバーロードである。 * private メンバを含むすべてのメンバに対し、指定した関数またはクラスにのみアクセスを許した い場合は、フレンド関数またはフレンドクラスを使用する。 図 4-3-基-4 オーバーロード

(11)

1) 関数の特長 * 引数のない関数 プロトタイプ宣言にて引数を持たない関数を定義する場合、C では「(void)」を用いて宣言を行う 必要があるが、C++では空の引数リスト「()」を用いて宣言を行うことができる。 * デフォルト引数 関数定義またはプロトタイプ宣言にて引数のデフォルト値を定義すると、関数の呼出し時に引 数を省略することができる。引数を省略した場合デフォルト値が指定されたとして処理を行う。 * 初期化子 クラスのインスタンスを生成する際に、メンバ変数を初期化するには、コンストラクタで初期化子 を使用する。また、定数をメンバ変数にする場合も、初期化子で定義する。 * インライン関数 インライン関数の宣言は inline 指定子を使用する。マクロ関数と同様に、関数のオーバーヘッド を回避する方法である。メンバ関数については、クラス定義時にプロトタイプを使用せず、関数 の実体を組み込むことでインライン化される。コンパイル時には、g++(gcc)に-O で最適化オプシ ョンを指定する必要がある。 2) 関数のオーバーロード 関数名は、処理内容を的確に表すように命名する必要があるが、引数として渡したいデータの型 が異なるだけで、処理内容が同等の関数に対して、それぞれ別々の名前を付けなくても済むように、 関数のオーバーロードという方法がある。関数のオーバーロードは、関数名が同一で、引数の型、 数、並び順が異なる関数を複数定義することができる。 コンストラクタもオーバーロードすることができる。引数を持たないコンストラクタをデフォルトコンスト ラクタといい、コンストラクタが何も定義されていなければ、コンパイラで自動的に生成される。 インスタンスを生成する際に、同じ型のインスタンスを初期値として使用する場合、初期化時に呼ば れるコンストラクタをコピーコンストラクタという。コピーコンストラクタは、明示的に定義されていなけ れば、コンパイラによって自動的に生成される。 3) 演算子のオーバーロード クラスの演算において、プログラマが自然な表現で理解しやすく記述できるように、+や-などの 演算子の処理内容を再定義することが、演算子のオーバーロードである。 代入演算子のオーバーロードは、クラス定義で明示的にオーバーロードを定義していない場合、コ ンパイラによって自動的に生成される。 4) フレンド private メンバを含むすべてのメンバに対し、指定した関数またはクラスにのみアクセスを許したい 場合は、フレンド関数またはフレンドクラスを使用する。特に、二項演算子をフレンドとしてオーバー ロードした場合は、第一仮引数に演算子の左オペランドが渡されるので、左オペランドに組み込み 型の変数などを使用されても、フレンドを利用することで、二項演算子の関数内に取り込むことが

(12)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-5. 継承と多相性 対応する コースウェア 第 7 回 継承と多相性

4-3-基-5. 継承と多相性

C++における継承の概念と、基底クラスから派生クラスを作成する方法を解説し、継承の形態による 継承後の属性の変化を説明する。また、オーバーライドの使用方法を解説し、仮想関数を利用した 多相性の実現方法を説明する。 【学習の要点】 * 既存のクラスを元に新しいクラス(派生クラス)を作成することをクラスの継承といい、オーバーラ イドによって元となるクラス(基底クラス)のメンバ関数を再定義することができる。 * 基底クラスのメンバが、派生クラスからアクセス可能になるか、また外部へ公開されるかは、継承 の形態で用いたアクセス識別子によって異なる。 * 仮想関数は、オーバーライドされることを考慮して定義する関数で、継承したクラスで独自の処 理をオーバーライドすることにより、同じ関数を実行するだけで、インスタンスごとの独自な処理 を行う多相性を実現する。 図 4-3-基-5 継承と多相性

(13)

1) 継承 クラスは、オブジェクト指向の要素である継承により、新しいクラスを定義することができる。継承元 となるクラスを「基底クラス」、継承により作成したクラスを「派生クラス」と呼ぶ。派生クラスは、基底ク ラスのメンバ変数やメンバ関数を継承する。但し、基底クラスのメンバが、派生クラスからアクセス可 能になるか、また外部へ公開されるかは、継承の形態で用いたアクセス識別子によって異なる。 * オーバーライド オーバーライドは、基底クラスのメンバ関数名と同じ名前のメンバ関数を派生クラスで再定義す ることである。これにより、派生クラスの操作に特化した機能を同じメンバ関数名で定義できる。 * コンストラクタとデストラクタの実行順序 派生クラスのインスタンスが作成されるときは、まず基底クラスのコンストラクタが実行され、次に 派生クラスのコンストラクタが実行される。これに対し、派生クラスのインスタンスが解放されるとき は、まず派生クラスのデストラクタが実行され、次に基底クラスのデストラクタが実行される。 * 基底クラスの初期化 基底クラスを初期化する場合は、派生クラスのコンストラクタで初期化子を使用する。 * 間接基底クラス 派生クラスを更に継承した場合、最初の基底クラスを間接基底クラスという。 2) 仮想関数と多相性 C++では、多相性を実現するために仮想関数を使用する。 * 仮想関数 仮想関数は、オーバーライドされることを考慮して定義する関数で、virtual キーワードを使用す る。仮想関数の機能が発揮されるのは、基底クラスへのポインタに対し、派生クラスのインスタン スを示すアドレスをバインドするときである。この時、基底クラスのメンバ関数を仮想関数にして いなければ、派生クラスでオーバーライドされていたとしても、基底クラスへのポインタが示すメ ンバ関数は、基底クラスのものになる。つまり、実体は派生クラスでも、オーバーライドが機能せ ず、基底クラスのメンバ関数が実行されてしまうことになる。これに対し、基底クラスのメンバ関数 が仮想関数に指定してあれば、オーバーライドが機能し、基底クラスへのポインタが示すメンバ 関数は、インスタンスが派生クラスで生成されていれば、派生クラスのものとなる。 * 多相性 クラス定義では、仮想関数を持つ基底クラスを継承した複数の派生クラスで、それぞれが、多相 性のためのアイデンティティを実装した、独自の処理をオーバーライドする。インスタンスは、状 況に合致した派生クラスで動的に生成し、基底クラスのポインタにアドレスをバインドする。この ポインタを使用する関数は、指し示す先のインスタンスが、どのようなクラスなのか知る必要がな く、基底クラスの仮想関数を実行するだけで、状況に合致した処理を行うことができる。 * 仮想デストラクタ デストラクタに virtual キーワードを使用したものが、仮想デストラクタである。仮想デストラクタを 定義していない基底クラスは、多相性でインスタンスが解放されたときに、派生クラスのデストラ

(14)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-6. 抽象クラス・多重継承 対応する コースウェア 第 8 回 抽象クラス・多重継承 第 13 回 演習(アルゴリズムとデータ構造の実装)

4-3-基-6. 抽象クラス・多重継承

関数の実体を持たない純粋仮想関数を少なくともひとつは持つ抽象クラスの概念を説明し、更にイ ンタフェースクラスを解説する。また、複数のクラスを継承する多重継承と、継承の重複を回避する 仮想基底クラスについて解説する。 【学習の要点】 * 抽象クラスは、関数の実体を持たない純粋仮想関数をメンバ関数に持ち、派生クラスでオーバ ーライドさせることを前提とするとともに、派生クラスで共通に利用できる資産を提供する。 * メンバ関数を純粋仮想関数のみで構成するクラスは、一般にインタフェースクラスといい、クラス の隠ぺいを強化し、クラス間を疎結合にすることができる。 * 純粋仮想関数は、派生クラスのオーバーライド忘れを防止し、抽象クラスのインスタンス化を禁 止する。 * C++は、複数のクラスを継承する多重継承を実現する。多重継承による継承の重複を回避する には仮想基底クラスを使用する。 図 4-3-基-6 抽象クラス・多重継承

(15)

1) 抽象クラス オブジェクト指向では、基本クラスのように自らを実体化できないクラスが多く存在する。このようなク ラスを C++では、純粋仮想関数を使用して実現している。 * 純粋仮想関数 純粋仮想関数は、関数の実体を持たない。次の条件を満たしていれば、純粋仮想関数として 定義することができる。 - 基底クラスのメンバ関数であること。 - 派生クラスでオーバーライドされること。 - 派生クラスのオーバーライドした関数が使用され、自らは使われないこと。 純粋仮想関数の定義は、仮想関数の定義の最後に=0 を付ける。純粋仮想関数が派生クラスで オーバーライドされていなければ、コンパイルエラーとなり、実装漏れを防止できる。 * 抽象クラス 抽象クラスは、純粋仮想関数を少なくともひとつは持つクラスである。メンバ関数の実体が実装 されていないため、抽象クラスをインスタンス化する実装はコンパイルエラーとなる。派生クラス で共通に利用できる資産は、抽象クラスの純粋仮想関数以外のメンバ関数に実装する。 * インタフェースクラス メンバ関数を純粋仮想関数のみで構成するクラスは、一般にインタフェースクラスといわれる。イ ンタフェースクラスは、派生クラスがどのような操作を持つのか明確にする。更に不要な情報が 排除されるため、カプセル化が強化され、クラス間を疎結合にすることができる。 2) 多重継承 複数のクラスから継承して新しいクラスを定義することを多重継承といい、異なる特性を持つ基底ク ラスを統合し、複数の特性を持つクラスを作成することができる。 * コンストラクタとデストラクタの実行順序 多重継承を定義するには、カンマ演算子で基底クラスを連結する。多重継承した派生クラスの インスタンスを生成するときに、実行される基底クラスのコンストラクタは、定義の並び順に左側 優先で順番に実行される。これに対し、デストラクタは、定義の並びの逆順に、右側から順番に 実行される * 仮想基底クラス 多重継承した派生クラスが、間接基底クラスを同一のクラスから継承した場合、継承の重複が発 生し、間接基底クラスのメンバに曖昧さが生じる。この問題を回避するために、仮想基底クラスを 使用する。仮想基底クラスの定義は、多重継承を定義する際に、virtual キーワードを使用して 基底クラスを連結する。この定義の並び順に従って、左側優先で最初に登場する間接基底クラ スがインスタンス化される。その後に登場する間接基底クラスは無視され、継承の重複が回避さ れる。

(16)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-7. テンプレート 対応する コースウェア 第 9 回 テンプレート 第 13 回 演習(アルゴリズムとデータ構造の実装)

4-3-基-7. テンプレート

C++におけるジェネリックプログラミングの実現手法として、テンプレートの概念と利便性を解説し、ソ ースコードの生成を自動化する関数テンプレートの定義方法と、要素の型が任意となるクラステンプ レートの定義方法を解説する。またクラステンプレートの例として string クラスを解説する。 【学習の要点】 * アルゴリズムやデータ構造を汎用化し、データ型の違いごとに、同じコードを何度も記述する手 間を省く、ジェネリックプログラミングの実現手法が、C++におけるテンプレートの機能である。 * 引数または戻り値の型だけが異なった、関連する複数の関数のアルゴリズムをひとつの枠にま とめた関数テンプレートにより、使用する型に合わせてコンパイル時に関数が自動生成される。 * 異なる複数のデータ型をひとつのクラスで扱えるように枠組みしたクラステンプレートにより、使 用する型に合わせてコンパイル時にクラスが自動生成される。 図 4-3-基-7 テンプレート

(17)

1) ジェネリックプログラミング ジェネリックプログラミングは、データ型に依存しないプログラミング手法である。アルゴリズムやデ ータ構造を汎用化し、データ型の違いごとに、同じコードを何度も記述する手間を省き、再利用性 を向上させる。 2) テンプレート C++では、テンプレートを使用することで、ジェネリックプログラミングを行うことができる。テンプレー トは、具体的なコードを作成するための抽象的な雛形として定義され、コンパイル時にデータ型に 合わせて実体を生成する仕組みを提供し、コンパイル時の多相性を実現する。テンプレートには 関数テンプレートとクラステンプレートがある。 * テンプレートの定義

テンプレートを定義する場合は、template キーワードを使用し、typename キーワードまたは class キーワードを使用して、テンプレート型の宣言を行う。複数のテンプレート型を使用する場合は、 カンマ演算子で連結する。尚、typename キーワードと class キーワードのどちらを使用しても違 いはない。

template < class T1, class T2, class T3, …略…, class Tn > * 関数テンプレート 関数テンプレートは、引数または戻り値の型だけが異なった、関連する複数の関数のアルゴリズ ムをひとつの枠にまとめることができる。定義方法は、テンプレートの定義に続けて、引数や戻り 値の型にテンプレート型を使用して関数を定義する。尚、使用する型に合わせてコンパイル時 に自動生成される関数をテンプレート関数ともいう。 * クラステンプレート クラステンプレートは、異なる複数のデータ型をひとつのクラスで扱えるように枠組みしたクラス である。テンプレート型でメンバ変数を持つことや、関数テンプレートをメンバ関数に持つことが できる。定義方法は、テンプレートの定義に続けて、テンプレート型を該当する変数に当てはめ てクラスを定義する。尚、使用する型に合わせてコンパイル時に自動生成されるクラスをテンプ レートクラスともいう。 * テンプレートの使用方法 関数テンプレートやクラステンプレートは、後に正式な型と置き換えるためのプレースホルダを 持っているにすぎない。そのため使用時には、具体的な型を特定し、型の曖昧さを排除する方 法がとられる。型の特定方法は、使用する関数やクラスの名前に続けて、具体的な型を指定す る。 // クラステンプレートを int 型に特定したインスタンスの生成 sample<int> obj; 3) string クラス C++の標準ライブラリには、basic_string クラステンプレートを使用した string クラスがあり、可変長の

(18)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-8. 例外・名前空間・キャスト・変換関数 対応する コースウェア 第 10 回 キャスト・名前空間 第 11 回 例外・変換関数

4-3-基-8. 例外・名前空間・キャスト・変換関数

C++における動的エラーの統一した処理として例外処理を説明する。その他、名前空間の詳細を解 説し、プログラムの実行時にデータ型を取得する実行時型情報の取得方法や、C にはないキャスト の方法、更に変換関数を解説する。 【学習の要点】 * C++ではプログラムの実行中にエラーが発生した場合、例外オブジェクトが生成されるためこれ を利用してエラー処理を行う。 * 名前空間の機能を使用することで、クラス名や関数名など同名定義での衝突を回避できる。 * 多相性などの機能により、実際にプログラムを実行するまでデータ型が定まらない場合は、 typeid 演算子を使用し、プログラム実行時におけるデータ型(実行時型情報)を取得できる。 図 4-3-基-8 例外処理の流れ

(19)

1) 例外 プログラムの実行中に発生するエラーのことを例外といい、例外を利用したエラー処理を例外処理 という。C++では、何らかの例外が発生すると、処理を中断して例外処理を行うことができる機構を 持っている。 * 例外オブジェクト 例外が発生すると、例外オブジェクトと呼ばれるインスタンスを生成する機構を備えている。例 外オブジェクトは、C++標準ライブラリの exception クラスや、その派生クラスのインスタンスである。 これらのクラスを例外クラスといい、継承して自らのプログラムに独自の例外クラスを作成するこ とが可能となっている。 * 例外監視 例外処理を行う場合は、プログラム中に例外の発生を監視するコードを埋め込む必要がある。 例外を監視するには try キーワードを使用して範囲を指定する。その範囲を try ブロックという。 * 例外捕捉 発生した例外を補足して、例外に対しての処理を行うには、catch キーワードを使用して範囲指 定を行う。この範囲を catch ブロックといい、例外が発生すると try ブロックの処理を中断し、強制 的に catch ブロックに制御が移り、処理が行われる。 例外を捕捉する方法は、以下の3通りある。 - ポインタで受け取る方法。 - 値で受け取る方法。 - 参照で受け取る方法。 * 例外投入 自らのプログラムで例外を投げるコードを埋め込むこともできる。その場合は、try ブロックの中 で throw キーワードを使用して例外を投げるコードを記述する。 2) 名前空間 プログラムの中を特定の名前を使用して分類することができる。この機能のことを名前空間という。 名前空間を使用することで、クラス名や関数名などの有効範囲が、属する名前空間内に制限され、 所属外での同名定義による衝突を回避することができる。 3) 実行時型情報 多相性などの機能により、実際にプログラムを実行するまでデータ型が定まらない場合は、typeid 演算子を使用し、プログラム実行時におけるデータ型(実行時型情報)を取得できる。 4) キャストと変換関数 C++では、C のキャストに加え、dynamic_cast、const_cast、static_cast、reinterpret_cast の4つが加 わり、安全性を強化している。また、変換関数を使用することで、クラスの型から別のデータ型へ暗 黙的に変換を行うことができる。

(20)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-9. 入出力 対応する コースウェア 第 12 回 入出力

4-3-基-9. 入出力

C での入出力を C++でサポートしていることを説明し、C++の入出力システムとの違いを解説する。 更に、定義済みマニピュレータとマニピュレータの作成方法、また抽出演算子や挿入演算子のオー バーロードの方法を解説する。 【学習の要点】 * C でのコンソールやファイルの入出力システムは C++でも利用できるが、更に C++では、入出力 ストリームに関する様々なクラスが用意されており、必要に応じてオーバーロードが可能で、柔 軟性に富んでいる。 * C++の入出力では、書式指定などの操作を行う特別な関数として、様々なマニピュレータが定 義されている。 * 入力ストリームからデータを取り出す抽出演算子や、出力ストリームにデータを挿入する挿入演 算子は、int 型や double 型といった組み込み型の全てについてオーバーロードされている。 図 4-3-基-9 入出力

(21)

1) C++の入出力システム C++の入出力システムは C と同様にストリームへの操作で成り立っており、C でのコンソールやファ イルの入出力システムは C++でも利用できる。但し、C++では、入出力ストリームに関する様々なク ラスが用意されており、必要に応じてオーバーロードが可能で、柔軟性に富んでいる。標準入力に は cin、標準出力には cout が用意されている。 2) 抽出演算子と挿入演算子 入力ストリームからデータを取り出すには抽出演算子「>>」を使用する。また出力ストリームにデータ を挿入するには挿入演算子「<<」を使用する。これらの演算子は、int 型や double 型といった組み 込み型の全てについてオーバーロードされている。更にオーバーロードして独自の抽出演算子や 挿入演算子を作成する場合は、フレンド関数を使用する必要がある。 3) マニピュレータ C++の入出力では、書式指定などの操作を行う特別な関数として、様々なマニピュレータが定義さ れている。代表的なものとして下記のものがある。 - endl :改行文字を出力してバッファをフラッシュする。 - ends :ヌル文字を出力する。 - flush :バッファをフラッシュする。 - dec :10 進数に変換する。 - hex :16 進数に変換する。 - setw(int) :出力フィールド幅を指定サイズに設定する。 また、独自のマニピュレータを自作することもできる。マニピュレータを作成する場合は、ストリーム への参照を受け取り、そのストリームへの参照を返すように記述する必要がある。 4) ファイル入出力 C++のファイルへの入出力をサポートするクラスには下記の3種類ある。 - ifstream :入力専用のファイルストリームクラス。 - ofstream :出力専用のファイルストリームクラス。 - fstream :入出力可能のファイルストリームクラス。 処理内容に応じて、これらのクラスからインスタンスを生成する。インスタンス生成時には、コンストラ クタの引数にファイル名を指定することができる。この場合は、コンストラクタでファイルが開かれる ので、メンバ関数の open を使用する必要はない。また、ファイルが正しく開かれたかどうかの検査 には、メンバ関数の is_open を使用する。入出力にはコンソールと同様に抽出演算子と挿入演算子 が使用できる。入出力の処理が終了し、インスタンスが解放される際に、デストラクタで自動的にフ ァイルが閉じられる。明示的にファイルを閉じる場合は、メンバ関数の close を使用する。

(22)

プログラミング分野 4-3-基 C++に関する知識 基本 習得ポイント 4-3-基-10. Standard Template Library

対応する コースウェア

第 14 回 STL の概要

第 15 回 アルゴリズムとデータ構造の使用

4-3-基-10. Standard Template Library

コンテナ、イテレータ、アルゴリズムのライブラリ化といった概念を説明し、C++によるその実装である STL (Standard Template Library)を紹介する。また STL によるプログラミング例を挙げ、STL の具 体的な使い方を解説する。

【学習の要点】

* STL(Standard Template Library)は C++言語のテンプレート機能を利用して実装されたコン テナ、アルゴリズム、イテレータ(反復子)で構成される標準的なライブラリである。 * コンテナとは他のオブジェクトを格納するための入れ物で、ベクトル、リスト、マップなどがあ る。 * アルゴリズムとは、アルゴリズムを配列やリストなどのデータ構造に依存しない形で実現に依 存しない形で汎用化したものである。 * イテレータとはコンテナの種類に関係なく同じアルゴリズムを適用するために実装するクラス である。 図 4-3-基-10 STL の構成

(23)

1) STL(Standard Template Library)とは プログラムの作成では同じ処理を記述することが多いため、よく利用される処理をライブラリとしてま とめたものが STL である。STL は C++のテンプレート機能を利用して作成されており、ヘッダファイ ルのインクルードにより使用できる。 2) コンテナ STL の中心となるもので、さまざまなデータを格納する。コンテナはデータが順番に格納される順 序コンテナと、キーによって自由にアクセスできる連想コンテナの 2 つに分類される。STL の基本的 なコンテナには以下のようなものがある。 - vector :ランダムにアクセス可能な順序コンテナ。 - deque :vector と同様のコンテナでデータの挿入や削除の操作を高速に行える。 - list :二重リンクリスト(双方向連結リスト)。ランダムアクセスには対応していない。 - set :オブジェクトのセット。セット内のオブジェクトは順序付けされている。 - multiset :同じオブジェクトを複数格納できるセット - map :キー値でオブジェクトを検索できるコンテナ。各キーは 1 つだけ値を格納する。 - multimap :各キーに複数の値を格納できるマップ。 3) イレテータ(反復子) イテレータはコンテナに格納されたデータへのアクセスを提供する。イテレータには、入力専用で アクセスする入力イテレータ、出力専用でアクセスする出力イテレータ、先頭から末尾の方向へ順 番にアクセスする前方イテレータ、双方向でのアクセスが可能な双方向イテレータ、全てのデータ にランダムにアクセスが可能なランダムイテレータがある。 使用できるイレテータはコンテナごとに決められている。 4) アルゴリズム コンテナを操作するための様々なアルゴリズムを実際のデータ構造(配列、リストなど)に依存しな いように汎用化したもので、以下のようなアルゴリズムがある。 - find :コンテナ内の要素を検索する。 - count :コンテナ内の要素をカウントする。 - equal :2つのデータが等しいかどうかを評価する。 - for_each :コンテナの各データに対して指定した関数を実行する。 - copy :コンテナをコピーする。 - reverse :順序を持つコンテナのオブジェクトの順序を逆にする。 5) STL 使用上の注意 STL では柔軟性があると同時に、コンテナや関数に多くの型を使用しているため、型を間違えて使

参照

関連したドキュメント

特に 2021 年から 2022 年前半については、2020 年にパンデミック受けての世界全体としてのガス需要減少があり、その反動

「エピステーメー」 ( )にある。これはコンテキストに依存しない「正

学生部と保健管理センターは,1月13日に,医療技術短 期大学部 (鶴間) で本年も,エイズとその感染予防に関す

を占めている。そのうち 75 歳以上の後期高齢者は 1,872 万人(14.9%)、80 歳以上は 1,125 万

 「収益認識に関する会計基準」(企業会計基準第29号 2020年3月31日。以下「収益認識会計基準」とい

第20回 4月 知っておきたい働くときの基礎知識① 11名 第21回 5月 知っておきたい働くときの基礎知識② 11名 第22回 6月

 英語の関学の伝統を継承するのが「子どもと英 語」です。初等教育における英語教育に対応でき

 吹付け石綿 (レベル1) 、断熱材等 (レベル2) が使用されて